Repository: google/iosched Branch: main Commit: 738e1e008096 Files: 934 Total size: 5.9 MB Directory structure: gitextract_nghn_xz8/ ├── .github/ │ ├── ci-gradle.properties │ └── workflows/ │ └── iosched.yaml ├── .gitignore ├── .idea/ │ └── copyright/ │ ├── iosched.xml │ └── profiles_settings.xml ├── CONTRIBUTING.md ├── LICENSE ├── README.md ├── androidTest-shared/ │ ├── build.gradle.kts │ └── src/ │ └── main/ │ ├── AndroidManifest.xml │ └── java/ │ └── com/ │ └── google/ │ └── samples/ │ └── apps/ │ └── iosched/ │ └── androidtest/ │ └── util/ │ └── LiveDataTestUtil.kt ├── ar/ │ ├── build.gradle.kts │ ├── consumer-proguard-rules.pro │ └── src/ │ └── main/ │ ├── AndroidManifest.xml │ ├── assets/ │ │ └── images.imgdb │ ├── java/ │ │ └── com/ │ │ └── google/ │ │ └── samples/ │ │ └── apps/ │ │ └── iosched/ │ │ └── ar/ │ │ └── ArActivity.kt │ └── res/ │ └── values/ │ └── styles.xml ├── benchmark/ │ ├── build.gradle.kts │ └── src/ │ ├── androidTest/ │ │ ├── AndroidManifest.xml │ │ └── java/ │ │ └── com/ │ │ └── google/ │ │ └── samples/ │ │ └── apps/ │ │ └── iosched/ │ │ └── benchmark/ │ │ ├── BootstrapConferenceDataSourceBenchmark.kt │ │ └── LoadAgendaUseCaseBenchmark.kt │ └── main/ │ └── AndroidManifest.xml ├── build.gradle.kts ├── buildSrc/ │ ├── build.gradle.kts │ └── src/ │ └── main/ │ └── java/ │ ├── Libs.kt │ └── Versions.kt ├── build_android_release.sh ├── copyright.kt ├── debug.keystore ├── depconstraints/ │ └── build.gradle.kts ├── gradle/ │ └── wrapper/ │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradle.properties ├── gradlew ├── gradlew.bat ├── kokoro/ │ ├── build.sh │ ├── continuous.cfg │ ├── continuous.sh │ ├── presubmit.cfg │ └── presubmit.sh ├── macrobenchmark/ │ ├── .gitignore │ ├── build.gradle │ ├── consumer-rules.pro │ ├── proguard-rules.pro │ └── src/ │ └── main/ │ ├── AndroidManifest.xml │ └── java/ │ └── com/ │ └── google/ │ └── samples/ │ └── apps/ │ └── iosched/ │ └── macrobenchmark/ │ ├── BaselineProfileGenerator.kt │ ├── BenchmarkUtils.kt │ ├── OpenDetailBenchmarks.kt │ ├── ScheduleBenchmarks.kt │ └── StartupBenchmarks.kt ├── mobile/ │ ├── build.gradle.kts │ ├── google-services.json │ ├── lint.xml │ ├── proguard-rules-benchmark.pro │ ├── proguard-rules.pro │ ├── sampledata/ │ │ ├── codelabs.json │ │ ├── day_indicator.json │ │ ├── map_variants.json │ │ └── tags.json │ └── src/ │ ├── androidTest/ │ │ ├── AndroidManifest.xml │ │ └── java/ │ │ └── com/ │ │ └── google/ │ │ └── samples/ │ │ └── apps/ │ │ └── iosched/ │ │ └── tests/ │ │ ├── CustomTestRunner.kt │ │ ├── FixedTimeRule.kt │ │ ├── MainTestApplication.kt │ │ ├── SetPreferencesRule.kt │ │ ├── di/ │ │ │ ├── HiltExt.kt │ │ │ ├── TestCoroutinesModule.kt │ │ │ └── TestPreferencesStorageModule.kt │ │ ├── prefs/ │ │ │ └── DataStorePreferenceStorageTest.kt │ │ └── ui/ │ │ ├── AgendaTest.kt │ │ ├── CodelabTest.kt │ │ ├── HomeTest.kt │ │ ├── InfoTest.kt │ │ ├── MainActivityTestRule.kt │ │ ├── MapTest.kt │ │ ├── ScheduleTest.kt │ │ ├── SessionDetailTest.kt │ │ └── SettingsTest.kt │ ├── debugRelease/ │ │ └── java/ │ │ └── com/ │ │ └── google/ │ │ └── samples/ │ │ └── apps/ │ │ └── iosched/ │ │ └── di/ │ │ └── SignInModule.kt │ ├── main/ │ │ ├── AndroidManifest.xml │ │ ├── assets/ │ │ │ ├── anim/ │ │ │ │ ├── 0.json │ │ │ │ ├── 1.json │ │ │ │ ├── 2.json │ │ │ │ ├── 3.json │ │ │ │ ├── 4.json │ │ │ │ ├── 5.json │ │ │ │ ├── 6.json │ │ │ │ ├── 7.json │ │ │ │ ├── 8.json │ │ │ │ └── 9.json │ │ │ └── licenses.html │ │ ├── baseline-prof.txt │ │ ├── java/ │ │ │ └── com/ │ │ │ └── google/ │ │ │ └── samples/ │ │ │ └── apps/ │ │ │ └── iosched/ │ │ │ ├── MainApplication.kt │ │ │ ├── di/ │ │ │ │ ├── AppModule.kt │ │ │ │ ├── CoroutinesModule.kt │ │ │ │ └── PreferencesStorageModule.kt │ │ │ ├── ui/ │ │ │ │ ├── DispatchInsetsNavHostFragment.kt │ │ │ │ ├── LaunchViewModel.kt │ │ │ │ ├── LauncherActivity.kt │ │ │ │ ├── MainActivity.kt │ │ │ │ ├── MainActivityViewModel.kt │ │ │ │ ├── MainNavigation.kt │ │ │ │ ├── NavigationExtensions.kt │ │ │ │ ├── SectionHeader.kt │ │ │ │ ├── agenda/ │ │ │ │ │ ├── AgendaAdapter.kt │ │ │ │ │ ├── AgendaFragment.kt │ │ │ │ │ ├── AgendaHeaderIndexer.kt │ │ │ │ │ ├── AgendaHeadersDecoration.kt │ │ │ │ │ ├── AgendaItemBindingAdapter.kt │ │ │ │ │ └── AgendaViewModel.kt │ │ │ │ ├── ar/ │ │ │ │ │ ├── ArCoreNotSupportedFragment.kt │ │ │ │ │ └── NoNetworkConnectionFragment.kt │ │ │ │ ├── codelabs/ │ │ │ │ │ ├── CodelabsActionsHandler.kt │ │ │ │ │ ├── CodelabsAdapter.kt │ │ │ │ │ ├── CodelabsFragment.kt │ │ │ │ │ └── CodelabsViewModel.kt │ │ │ │ ├── feed/ │ │ │ │ │ ├── AnnouncementsFragment.kt │ │ │ │ │ ├── AnnouncementsViewModel.kt │ │ │ │ │ ├── FeedAdapter.kt │ │ │ │ │ ├── FeedAnnouncementViewBinders.kt │ │ │ │ │ ├── FeedFragment.kt │ │ │ │ │ ├── FeedHeaderViewBinders.kt │ │ │ │ │ ├── FeedSectionHeaderViewBinder.kt │ │ │ │ │ ├── FeedSessionsViewBinder.kt │ │ │ │ │ ├── FeedSocialChannelsSectionViewBinder.kt │ │ │ │ │ ├── FeedSustainabilitySectionViewBinder.kt │ │ │ │ │ └── FeedViewModel.kt │ │ │ │ ├── filters/ │ │ │ │ │ ├── CloseableFilterChipAdapter.kt │ │ │ │ │ ├── FilterChip.kt │ │ │ │ │ ├── FiltersFragment.kt │ │ │ │ │ ├── FiltersViewBindingAdapters.kt │ │ │ │ │ ├── FiltersViewModel.kt │ │ │ │ │ ├── FiltersViewModelDelegateModule.kt │ │ │ │ │ └── SelectableFilterChipAdapter.kt │ │ │ │ ├── info/ │ │ │ │ │ ├── EventFragment.kt │ │ │ │ │ ├── EventInfoViewModel.kt │ │ │ │ │ ├── FaqFragment.kt │ │ │ │ │ ├── InfoFragment.kt │ │ │ │ │ └── TravelFragment.kt │ │ │ │ ├── map/ │ │ │ │ │ ├── LoadGeoJsonFeaturesUseCase.kt │ │ │ │ │ ├── MapFragment.kt │ │ │ │ │ ├── MapTileProvider.kt │ │ │ │ │ ├── MapUtils.kt │ │ │ │ │ ├── MapVariant.kt │ │ │ │ │ ├── MapVariantAdapter.kt │ │ │ │ │ ├── MapVariantSelectionDialogFragment.kt │ │ │ │ │ ├── MapViewBindingAdapters.kt │ │ │ │ │ └── MapViewModel.kt │ │ │ │ ├── messages/ │ │ │ │ │ ├── SnackbarMessage.kt │ │ │ │ │ ├── SnackbarMessageFragmentExtensions.kt │ │ │ │ │ └── SnackbarMessageManager.kt │ │ │ │ ├── onboarding/ │ │ │ │ │ ├── OnboardingActivity.kt │ │ │ │ │ ├── OnboardingFragment.kt │ │ │ │ │ ├── OnboardingSignInFragment.kt │ │ │ │ │ ├── OnboardingViewModel.kt │ │ │ │ │ ├── ViewPagerPager.kt │ │ │ │ │ ├── WelcomeDuringConferenceFragment.kt │ │ │ │ │ ├── WelcomePostConferenceFragment.kt │ │ │ │ │ └── WelcomePreConferenceFragment.kt │ │ │ │ ├── reservation/ │ │ │ │ │ ├── RemoveReservationDialogFragment.kt │ │ │ │ │ ├── RemoveReservationViewModel.kt │ │ │ │ │ ├── ReservationTextView.kt │ │ │ │ │ ├── ReservationViewState.kt │ │ │ │ │ ├── ReserveButton.kt │ │ │ │ │ ├── StarReserveFab.kt │ │ │ │ │ └── SwapReservationDialogFragment.kt │ │ │ │ ├── schedule/ │ │ │ │ │ ├── DayIndicator.kt │ │ │ │ │ ├── DayIndicatorAdapter.kt │ │ │ │ │ ├── DaySeparatorItemDecoration.kt │ │ │ │ │ ├── ScheduleFragment.kt │ │ │ │ │ ├── ScheduleItemBindingAdapter.kt │ │ │ │ │ ├── ScheduleNavigationAction.kt │ │ │ │ │ ├── ScheduleTimeHeadersDecoration.kt │ │ │ │ │ ├── ScheduleTwoPaneFragment.kt │ │ │ │ │ ├── ScheduleTwoPaneViewModel.kt │ │ │ │ │ ├── ScheduleUiHintsDialogFragment.kt │ │ │ │ │ ├── ScheduleViewModel.kt │ │ │ │ │ └── SessionHeaderIndexer.kt │ │ │ │ ├── search/ │ │ │ │ │ ├── SearchFilterFragment.kt │ │ │ │ │ ├── SearchFragment.kt │ │ │ │ │ └── SearchViewModel.kt │ │ │ │ ├── sessioncommon/ │ │ │ │ │ ├── EventActions.kt │ │ │ │ │ ├── OnSessionStarClickDelegate.kt │ │ │ │ │ ├── OnSessionStarClickDelegateModule.kt │ │ │ │ │ ├── SessionCommonExtensions.kt │ │ │ │ │ ├── SessionViewPoolModule.kt │ │ │ │ │ ├── SessionsAdapter.kt │ │ │ │ │ ├── TagAdapter.kt │ │ │ │ │ └── TagBindingAdapters.kt │ │ │ │ ├── sessiondetail/ │ │ │ │ │ ├── SessionDetailAdapter.kt │ │ │ │ │ ├── SessionDetailDataBindingAdapters.kt │ │ │ │ │ ├── SessionDetailFragment.kt │ │ │ │ │ ├── SessionDetailNavigationAction.kt │ │ │ │ │ ├── SessionDetailViewModel.kt │ │ │ │ │ ├── SessionFeedbackFragment.kt │ │ │ │ │ └── SessionFeedbackViewModel.kt │ │ │ │ ├── settings/ │ │ │ │ │ ├── SettingsFragment.kt │ │ │ │ │ ├── SettingsViewModel.kt │ │ │ │ │ └── ThemeSettingDialogFragment.kt │ │ │ │ ├── signin/ │ │ │ │ │ ├── NotificationsPreferenceDialogFragment.kt │ │ │ │ │ ├── SignInDialogFragment.kt │ │ │ │ │ ├── SignInViewExtensions.kt │ │ │ │ │ ├── SignInViewModel.kt │ │ │ │ │ ├── SignInViewModelDelegate.kt │ │ │ │ │ ├── SignInViewModelDelegateModule.kt │ │ │ │ │ └── SignOutDialogFragment.kt │ │ │ │ ├── speaker/ │ │ │ │ │ ├── SpeakerAdapter.kt │ │ │ │ │ ├── SpeakerBindingAdapters.kt │ │ │ │ │ ├── SpeakerFragment.kt │ │ │ │ │ └── SpeakerViewModel.kt │ │ │ │ └── theme/ │ │ │ │ ├── ThemeViewModel.kt │ │ │ │ ├── ThemedActivityDelegate.kt │ │ │ │ └── ThemedActivityDelegateModule.kt │ │ │ ├── util/ │ │ │ │ ├── CircularOutlineProvider.kt │ │ │ │ ├── CrashlyticsTree.kt │ │ │ │ ├── Extensions.kt │ │ │ │ ├── FirebaseAnalyticsHelper.kt │ │ │ │ ├── GlideTargets.kt │ │ │ │ ├── NavigationBarScrimBehavior.kt │ │ │ │ ├── RecyclerViewExtensions.kt │ │ │ │ ├── SharingStartedViews.kt │ │ │ │ ├── StatusBarScrimBehavior.kt │ │ │ │ ├── UiUtils.kt │ │ │ │ ├── ViewBindingAdapters.kt │ │ │ │ ├── WindowInsetsListeners.kt │ │ │ │ ├── initializers/ │ │ │ │ │ ├── AndroidThreeTenInitializer.kt │ │ │ │ │ ├── StrictModeInitializer.kt │ │ │ │ │ └── TimberInitializer.kt │ │ │ │ ├── signin/ │ │ │ │ │ ├── FirebaseAuthErrorCodeConverter.kt │ │ │ │ │ ├── SignInHandler.kt │ │ │ │ │ └── SignInResult.kt │ │ │ │ └── wifi/ │ │ │ │ └── WifiInstaller.kt │ │ │ └── widget/ │ │ │ ├── BottomSheetBehavior.kt │ │ │ ├── BubbleDecoration.kt │ │ │ ├── CollapsibleCard.kt │ │ │ ├── CountdownView.kt │ │ │ ├── CustomSwipeRefreshLayout.kt │ │ │ ├── EventCardView.kt │ │ │ ├── FadingSnackbar.kt │ │ │ ├── HashtagIoDecoration.kt │ │ │ ├── IoSlidingPaneLayout.kt │ │ │ ├── JumpSmoothScroller.kt │ │ │ ├── NavigationBarContentFrameLayout.kt │ │ │ ├── NoTouchRecyclerView.kt │ │ │ ├── SimpleRatingBar.kt │ │ │ ├── SpaceDecoration.kt │ │ │ └── transition/ │ │ │ └── RotateX.kt │ │ └── res/ │ │ ├── animator/ │ │ │ └── active_alpha.xml │ │ ├── color/ │ │ │ ├── chip_bg.xml │ │ │ ├── chip_stroke.xml │ │ │ ├── map_variant_icon.xml │ │ │ ├── map_variant_text.xml │ │ │ ├── navigation_item_background_tint.xml │ │ │ └── schedule_day_indicator_text.xml │ │ ├── drawable/ │ │ │ ├── arcore_gray.xml │ │ │ ├── asld_chip_icon.xml │ │ │ ├── asld_reservation.xml │ │ │ ├── asld_star_event.xml │ │ │ ├── avd_chip_check_to_dot.xml │ │ │ ├── avd_chip_dot_to_check.xml │ │ │ ├── avd_pending_to_reservable.xml │ │ │ ├── avd_pending_to_reserved.xml │ │ │ ├── avd_pending_to_waitlisted.xml │ │ │ ├── avd_reservable_to_pending.xml │ │ │ ├── avd_reserved_to_pending.xml │ │ │ ├── avd_star_event.xml │ │ │ ├── avd_unstar_event.xml │ │ │ ├── avd_waitlisted_to_pending.xml │ │ │ ├── bullet_small.xml │ │ │ ├── chip_check.xml │ │ │ ├── chip_dot.xml │ │ │ ├── divider_empty_margin_normal.xml │ │ │ ├── divider_empty_margin_small.xml │ │ │ ├── divider_slash.xml │ │ │ ├── event_header_afterhours.xml │ │ │ ├── event_header_codelabs.xml │ │ │ ├── event_header_meals.xml │ │ │ ├── event_header_office_hours.xml │ │ │ ├── event_header_sandbox.xml │ │ │ ├── event_header_sessions.xml │ │ │ ├── event_narrow_afterhours.xml │ │ │ ├── event_narrow_app_reviews1.xml │ │ │ ├── event_narrow_app_reviews2.xml │ │ │ ├── event_narrow_app_reviews3.xml │ │ │ ├── event_narrow_game_reviews1.xml │ │ │ ├── event_narrow_game_reviews2.xml │ │ │ ├── event_narrow_game_reviews3.xml │ │ │ ├── event_narrow_keynote.xml │ │ │ ├── event_narrow_office_hours1.xml │ │ │ ├── event_narrow_office_hours2.xml │ │ │ ├── event_narrow_office_hours3.xml │ │ │ ├── event_narrow_other.xml │ │ │ ├── event_narrow_session1.xml │ │ │ ├── event_narrow_session2.xml │ │ │ ├── event_narrow_session3.xml │ │ │ ├── event_narrow_session4.xml │ │ │ ├── event_placeholder_keynote.xml │ │ │ ├── event_placeholder_session1.xml │ │ │ ├── event_placeholder_session2.xml │ │ │ ├── event_placeholder_session3.xml │ │ │ ├── event_placeholder_session4.xml │ │ │ ├── fading_snackbar_background.xml │ │ │ ├── filters_sheet_background.xml │ │ │ ├── filters_sheet_header_shadow.xml │ │ │ ├── generic_placeholder.xml │ │ │ ├── hashtag_io19.xml │ │ │ ├── ic_agenda_after_hours.xml │ │ │ ├── ic_agenda_badge.xml │ │ │ ├── ic_agenda_codelab.xml │ │ │ ├── ic_agenda_concert.xml │ │ │ ├── ic_agenda_keynote.xml │ │ │ ├── ic_agenda_meal.xml │ │ │ ├── ic_agenda_office_hours.xml │ │ │ ├── ic_agenda_sandbox.xml │ │ │ ├── ic_agenda_session.xml │ │ │ ├── ic_agenda_store.xml │ │ │ ├── ic_arrow_back.xml │ │ │ ├── ic_arrow_right.xml │ │ │ ├── ic_clear_all.xml │ │ │ ├── ic_default_avatar_1.xml │ │ │ ├── ic_default_avatar_2.xml │ │ │ ├── ic_default_avatar_3.xml │ │ │ ├── ic_default_profile_avatar.xml │ │ │ ├── ic_expand_more.xml │ │ │ ├── ic_feed_social_button_bg.xml │ │ │ ├── ic_filter.xml │ │ │ ├── ic_filter_clear.xml │ │ │ ├── ic_launch.xml │ │ │ ├── ic_layers.xml │ │ │ ├── ic_login.xml │ │ │ ├── ic_logo_assistant.xml │ │ │ ├── ic_logo_components.xml │ │ │ ├── ic_logo_facebook.xml │ │ │ ├── ic_logo_google_developers.xml │ │ │ ├── ic_logo_instagram.xml │ │ │ ├── ic_logo_twitter.xml │ │ │ ├── ic_logo_youtube.xml │ │ │ ├── ic_logout.xml │ │ │ ├── ic_map_after_dark.xml │ │ │ ├── ic_map_concert.xml │ │ │ ├── ic_map_daytime.xml │ │ │ ├── ic_menu.xml │ │ │ ├── ic_my_location.xml │ │ │ ├── ic_nav_agenda.xml │ │ │ ├── ic_nav_codelabs.xml │ │ │ ├── ic_nav_home.xml │ │ │ ├── ic_nav_info.xml │ │ │ ├── ic_nav_map.xml │ │ │ ├── ic_nav_schedule.xml │ │ │ ├── ic_nav_settings.xml │ │ │ ├── ic_nav_signpost.xml │ │ │ ├── ic_play.xml │ │ │ ├── ic_play_circle_outline.xml │ │ │ ├── ic_question_answer.xml │ │ │ ├── ic_reservable.xml │ │ │ ├── ic_reservation.xml │ │ │ ├── ic_reservation_disabled.xml │ │ │ ├── ic_reservation_pending.xml │ │ │ ├── ic_reserved.xml │ │ │ ├── ic_search.xml │ │ │ ├── ic_share.xml │ │ │ ├── ic_sustainability_art.xml │ │ │ ├── ic_tune.xml │ │ │ ├── ic_waitlist_available.xml │ │ │ ├── ic_waitlisted.xml │ │ │ ├── io_logo_color.xml │ │ │ ├── list_divider.xml │ │ │ ├── map_marker_1.xml │ │ │ ├── map_marker_2.xml │ │ │ ├── map_marker_3.xml │ │ │ ├── map_marker_4.xml │ │ │ ├── map_marker_5.xml │ │ │ ├── map_marker_6.xml │ │ │ ├── map_marker_7.xml │ │ │ ├── map_marker_8.xml │ │ │ ├── map_marker_a.xml │ │ │ ├── map_marker_b.xml │ │ │ ├── map_marker_bike.xml │ │ │ ├── map_marker_c.xml │ │ │ ├── map_marker_charging.xml │ │ │ ├── map_marker_d.xml │ │ │ ├── map_marker_drink.xml │ │ │ ├── map_marker_e.xml │ │ │ ├── map_marker_f.xml │ │ │ ├── map_marker_food.xml │ │ │ ├── map_marker_g.xml │ │ │ ├── map_marker_h.xml │ │ │ ├── map_marker_handicap.xml │ │ │ ├── map_marker_i.xml │ │ │ ├── map_marker_info.xml │ │ │ ├── map_marker_label_background.xml │ │ │ ├── map_marker_lounge.xml │ │ │ ├── map_marker_medical.xml │ │ │ ├── map_marker_mothers_room.xml │ │ │ ├── map_marker_parking.xml │ │ │ ├── map_marker_restroom.xml │ │ │ ├── map_marker_rideshare.xml │ │ │ ├── map_marker_service_dog.xml │ │ │ ├── map_marker_shuttle.xml │ │ │ ├── map_marker_star.xml │ │ │ ├── map_marker_store.xml │ │ │ ├── map_marker_water.xml │ │ │ ├── navigation_item_background.xml │ │ │ ├── no_items_found_204.xml │ │ │ ├── onboarding_io_19.xml │ │ │ ├── onboarding_io_date_2019.xml │ │ │ ├── onboarding_schedule.xml │ │ │ ├── page_margin.xml │ │ │ ├── preview_window.xml │ │ │ ├── signal_wifi_off.xml │ │ │ ├── tab_indicator.xml │ │ │ └── unrated_thumb.xml │ │ ├── drawable-anydpi-v23/ │ │ │ ├── preview_window.xml │ │ │ └── preview_window_logo.xml │ │ ├── layout/ │ │ │ ├── activity_main.xml │ │ │ ├── activity_onboarding.xml │ │ │ ├── activity_session_detail.xml │ │ │ ├── collapsible_card_content.xml │ │ │ ├── countdown.xml │ │ │ ├── dialog_schedule_hints.xml │ │ │ ├── dialog_sign_in.xml │ │ │ ├── dialog_sign_out.xml │ │ │ ├── event_card_content.xml │ │ │ ├── fading_snackbar_layout.xml │ │ │ ├── fragment_agenda.xml │ │ │ ├── fragment_announcements.xml │ │ │ ├── fragment_arcore_not_supported.xml │ │ │ ├── fragment_codelabs.xml │ │ │ ├── fragment_feed.xml │ │ │ ├── fragment_filters.xml │ │ │ ├── fragment_info.xml │ │ │ ├── fragment_info_event.xml │ │ │ ├── fragment_info_faq.xml │ │ │ ├── fragment_info_travel.xml │ │ │ ├── fragment_map.xml │ │ │ ├── fragment_map_variant_select.xml │ │ │ ├── fragment_no_network.xml │ │ │ ├── fragment_onboarding.xml │ │ │ ├── fragment_onboarding_signin.xml │ │ │ ├── fragment_onboarding_welcome_during.xml │ │ │ ├── fragment_onboarding_welcome_post.xml │ │ │ ├── fragment_onboarding_welcome_pre.xml │ │ │ ├── fragment_schedule.xml │ │ │ ├── fragment_schedule_two_pane.xml │ │ │ ├── fragment_search.xml │ │ │ ├── fragment_session_detail.xml │ │ │ ├── fragment_session_feedback.xml │ │ │ ├── fragment_settings.xml │ │ │ ├── fragment_speaker.xml │ │ │ ├── include_agenda_contents.xml │ │ │ ├── info_wifi_card.xml │ │ │ ├── item_agenda_dark.xml │ │ │ ├── item_agenda_light.xml │ │ │ ├── item_codelab.xml │ │ │ ├── item_codelabs_information_card.xml │ │ │ ├── item_feed_announcement.xml │ │ │ ├── item_feed_announcements_empty.xml │ │ │ ├── item_feed_announcements_header.xml │ │ │ ├── item_feed_announcements_loading.xml │ │ │ ├── item_feed_countdown.xml │ │ │ ├── item_feed_moment.xml │ │ │ ├── item_feed_session.xml │ │ │ ├── item_feed_sessions_container.xml │ │ │ ├── item_feed_social_channels.xml │ │ │ ├── item_feed_sustainability.xml │ │ │ ├── item_filter_chip_closeable.xml │ │ │ ├── item_filter_chip_selectable.xml │ │ │ ├── item_generic_section_header.xml │ │ │ ├── item_inline_tag.xml │ │ │ ├── item_map_variant.xml │ │ │ ├── item_question.xml │ │ │ ├── item_schedule_day_indicator.xml │ │ │ ├── item_session.xml │ │ │ ├── item_session_info.xml │ │ │ ├── item_speaker.xml │ │ │ ├── item_speaker_info.xml │ │ │ ├── navigation_header.xml │ │ │ ├── navigation_rail_header.xml │ │ │ ├── search_active_filters_narrow.xml │ │ │ └── search_active_filters_wide.xml │ │ ├── layout-w500dp/ │ │ │ └── event_card_content.xml │ │ ├── layout-w720dp/ │ │ │ └── activity_main.xml │ │ ├── layout-w840dp/ │ │ │ └── item_codelab.xml │ │ ├── menu/ │ │ │ ├── bar_navigation.xml │ │ │ ├── codelabs_menu.xml │ │ │ ├── drawer_navigation.xml │ │ │ ├── map_menu.xml │ │ │ ├── profile.xml │ │ │ ├── schedule_menu.xml │ │ │ ├── search_menu.xml │ │ │ └── session_detail_menu.xml │ │ ├── navigation/ │ │ │ ├── nav_graph.xml │ │ │ ├── schedule_detail.xml │ │ │ └── schedule_list.xml │ │ ├── raw/ │ │ │ ├── map_markers_concert.json │ │ │ ├── map_markers_day.json │ │ │ ├── map_markers_night.json │ │ │ ├── map_style_day.json │ │ │ └── map_style_night.json │ │ ├── transition/ │ │ │ ├── codelab_toggle.xml │ │ │ ├── info_card_toggle.xml │ │ │ └── speaker_shared_enter.xml │ │ ├── values/ │ │ │ ├── attrs.xml │ │ │ ├── colors.xml │ │ │ ├── config.xml │ │ │ ├── dimens.xml │ │ │ ├── donottranslate.xml │ │ │ ├── ids.xml │ │ │ ├── strings.xml │ │ │ ├── styles.xml │ │ │ └── themes.xml │ │ ├── values-ar/ │ │ │ └── strings.xml │ │ ├── values-ar-rEG/ │ │ │ └── strings.xml │ │ ├── values-ar-rSA/ │ │ │ └── strings.xml │ │ ├── values-de/ │ │ │ └── strings.xml │ │ ├── values-de-rAT/ │ │ │ └── strings.xml │ │ ├── values-de-rCH/ │ │ │ └── strings.xml │ │ ├── values-es-rAR/ │ │ │ └── strings.xml │ │ ├── values-es-rBO/ │ │ │ └── strings.xml │ │ ├── values-es-rCL/ │ │ │ └── strings.xml │ │ ├── values-es-rCO/ │ │ │ └── strings.xml │ │ ├── values-es-rCR/ │ │ │ └── strings.xml │ │ ├── values-es-rDO/ │ │ │ └── strings.xml │ │ ├── values-es-rEC/ │ │ │ └── strings.xml │ │ ├── values-es-rGT/ │ │ │ └── strings.xml │ │ ├── values-es-rHN/ │ │ │ └── strings.xml │ │ ├── values-es-rMX/ │ │ │ └── strings.xml │ │ ├── values-es-rNI/ │ │ │ └── strings.xml │ │ ├── values-es-rPA/ │ │ │ └── strings.xml │ │ ├── values-es-rPE/ │ │ │ └── strings.xml │ │ ├── values-es-rPR/ │ │ │ └── strings.xml │ │ ├── values-es-rPY/ │ │ │ └── strings.xml │ │ ├── values-es-rSV/ │ │ │ └── strings.xml │ │ ├── values-es-rUS/ │ │ │ └── strings.xml │ │ ├── values-es-rUY/ │ │ │ └── strings.xml │ │ ├── values-es-rVE/ │ │ │ └── strings.xml │ │ ├── values-fa/ │ │ │ └── strings.xml │ │ ├── values-fr/ │ │ │ └── strings.xml │ │ ├── values-fr-rCH/ │ │ │ └── strings.xml │ │ ├── values-gsw/ │ │ │ └── strings.xml │ │ ├── values-h600dp/ │ │ │ └── dimens.xml │ │ ├── values-it/ │ │ │ └── strings.xml │ │ ├── values-ja/ │ │ │ └── strings.xml │ │ ├── values-ko/ │ │ │ └── strings.xml │ │ ├── values-land/ │ │ │ └── strings.xml │ │ ├── values-ldrtl/ │ │ │ └── dimens.xml │ │ ├── values-ln/ │ │ │ └── strings.xml │ │ ├── values-night/ │ │ │ └── colors.xml │ │ ├── values-notnight-v23/ │ │ │ ├── colors.xml │ │ │ └── config.xml │ │ ├── values-notnight-v27/ │ │ │ ├── colors.xml │ │ │ └── config.xml │ │ ├── values-pt/ │ │ │ └── strings.xml │ │ ├── values-pt-rBR/ │ │ │ └── strings.xml │ │ ├── values-ru/ │ │ │ └── strings.xml │ │ ├── values-sw384dp/ │ │ │ └── dimens.xml │ │ ├── values-th/ │ │ │ └── strings.xml │ │ ├── values-v29/ │ │ │ └── themes.xml │ │ ├── values-vi/ │ │ │ └── strings.xml │ │ ├── values-w1024dp/ │ │ │ └── dimens.xml │ │ ├── values-w500dp/ │ │ │ └── dimens.xml │ │ ├── values-w600dp/ │ │ │ └── dimens.xml │ │ ├── values-w840dp/ │ │ │ ├── dimens.xml │ │ │ ├── donottranslate.xml │ │ │ └── styles.xml │ │ ├── values-zh/ │ │ │ └── strings.xml │ │ ├── values-zh-rCN/ │ │ │ └── strings.xml │ │ ├── values-zh-rHK/ │ │ │ └── strings.xml │ │ └── values-zh-rTW/ │ │ └── strings.xml │ ├── release/ │ │ └── google-services.json │ ├── staging/ │ │ ├── AndroidManifest.xml │ │ └── java/ │ │ └── com/ │ │ └── google/ │ │ └── samples/ │ │ └── apps/ │ │ └── iosched/ │ │ ├── di/ │ │ │ └── SignInModule.kt │ │ ├── shared/ │ │ │ └── data/ │ │ │ └── login/ │ │ │ ├── StagingSignInHandler.kt │ │ │ └── datasources/ │ │ │ └── StagingUserDataSources.kt │ │ └── test/ │ │ └── HiltTestActivity.kt │ └── test/ │ └── java/ │ └── com/ │ └── google/ │ └── samples/ │ └── apps/ │ └── iosched/ │ ├── model/ │ │ └── MobileTestData.kt │ ├── test/ │ │ └── util/ │ │ ├── fakes/ │ │ │ ├── FakeAnalyticsHelper.kt │ │ │ ├── FakeAppDatabase.kt │ │ │ ├── FakeConferenceDataSource.kt │ │ │ ├── FakeOnSessionStarClickDelegate.kt │ │ │ ├── FakePreferenceStorage.kt │ │ │ ├── FakeSignInViewModelDelegate.kt │ │ │ ├── FakeStarEventUseCase.kt │ │ │ └── FakeThemedActivityDelegate.kt │ │ └── time/ │ │ └── FixedTimeProvider.kt │ ├── ui/ │ │ ├── LaunchViewModelTest.kt │ │ ├── MainActivityViewModelTest.kt │ │ ├── agenda/ │ │ │ ├── AgendaHeaderIndexerTest.kt │ │ │ └── AgendaViewModelTest.kt │ │ ├── codelabs/ │ │ │ └── CodelabsViewModelTest.kt │ │ ├── feed/ │ │ │ ├── FeedViewModelTest.kt │ │ │ ├── TestAnnouncementDataSource.kt │ │ │ └── TestMomentDataSource.kt │ │ ├── filters/ │ │ │ └── FiltersViewModelTest.kt │ │ ├── map/ │ │ │ ├── MapVariantTest.kt │ │ │ └── MapViewModelTest.kt │ │ ├── messages/ │ │ │ └── SnackbarMessageManagerTest.kt │ │ ├── onboarding/ │ │ │ └── OnboardingViewModelTest.kt │ │ ├── reservation/ │ │ │ └── RemoveReservationViewModelTest.kt │ │ ├── schedule/ │ │ │ ├── MarkScheduleUiHintsShownUseCaseTest.kt │ │ │ ├── ScheduleViewModelTest.kt │ │ │ ├── SessionHeaderIndexerTest.kt │ │ │ └── TestUserEventDataSource.kt │ │ ├── sessioncommon/ │ │ │ └── OnSessionStarClickDelegateTest.kt │ │ ├── sessiondetail/ │ │ │ ├── SessionDetailViewModelTest.kt │ │ │ └── SessionFeedbackViewModelTest.kt │ │ ├── settings/ │ │ │ └── SettingsViewModelTest.kt │ │ ├── signin/ │ │ │ ├── FirebaseSignInViewModelDelegateTest.kt │ │ │ └── SignInViewModelTest.kt │ │ └── speaker/ │ │ └── SpeakerViewModelTest.kt │ └── util/ │ ├── WifiConfigurationStringsTest.kt │ └── signin/ │ └── FirebaseAuthErrorCodeConverterTest.kt ├── model/ │ ├── build.gradle.kts │ └── src/ │ └── main/ │ └── java/ │ └── com/ │ └── google/ │ └── samples/ │ └── apps/ │ └── iosched/ │ └── model/ │ ├── Announcement.kt │ ├── Block.kt │ ├── Codelab.kt │ ├── ConferenceData.kt │ ├── ConferenceDay.kt │ ├── ConferenceWifiInfo.kt │ ├── Moment.kt │ ├── Room.kt │ ├── Session.kt │ ├── Speaker.kt │ ├── Tag.kt │ ├── Theme.kt │ ├── User.kt │ ├── filters/ │ │ └── Filter.kt │ ├── reservations/ │ │ ├── ReservationRequest.kt │ │ └── ReservationRequestResult.kt │ ├── schedule/ │ │ └── PinnedSessionsSchedule.kt │ └── userdata/ │ ├── UserEvent.kt │ └── UserSession.kt ├── playstore/ │ ├── listing_ar.txt │ ├── listing_de.txt │ ├── listing_en.txt │ ├── listing_es-rES.txt │ ├── listing_fr.txt │ ├── listing_it.txt │ ├── listing_ja.txt │ ├── listing_ko.txt │ ├── listing_pt-rBR.txt │ ├── listing_ru-rRU.txt │ ├── listing_zh-rCN.txt │ ├── src/ │ │ └── main/ │ │ └── res/ │ │ ├── values/ │ │ │ └── strings.xml │ │ ├── values-ar/ │ │ │ └── strings.xml │ │ ├── values-ar-rEG/ │ │ │ └── strings.xml │ │ ├── values-ar-rSA/ │ │ │ └── strings.xml │ │ ├── values-de/ │ │ │ └── strings.xml │ │ ├── values-de-rAT/ │ │ │ └── strings.xml │ │ ├── values-de-rCH/ │ │ │ └── strings.xml │ │ ├── values-es-rAR/ │ │ │ └── strings.xml │ │ ├── values-es-rBO/ │ │ │ └── strings.xml │ │ ├── values-es-rCL/ │ │ │ └── strings.xml │ │ ├── values-es-rCO/ │ │ │ └── strings.xml │ │ ├── values-es-rCR/ │ │ │ └── strings.xml │ │ ├── values-es-rDO/ │ │ │ └── strings.xml │ │ ├── values-es-rEC/ │ │ │ └── strings.xml │ │ ├── values-es-rGT/ │ │ │ └── strings.xml │ │ ├── values-es-rHN/ │ │ │ └── strings.xml │ │ ├── values-es-rMX/ │ │ │ └── strings.xml │ │ ├── values-es-rNI/ │ │ │ └── strings.xml │ │ ├── values-es-rPA/ │ │ │ └── strings.xml │ │ ├── values-es-rPE/ │ │ │ └── strings.xml │ │ ├── values-es-rPR/ │ │ │ └── strings.xml │ │ ├── values-es-rPY/ │ │ │ └── strings.xml │ │ ├── values-es-rSV/ │ │ │ └── strings.xml │ │ ├── values-es-rUS/ │ │ │ └── strings.xml │ │ ├── values-es-rUY/ │ │ │ └── strings.xml │ │ ├── values-es-rVE/ │ │ │ └── strings.xml │ │ ├── values-fa/ │ │ │ └── strings.xml │ │ ├── values-fr/ │ │ │ └── strings.xml │ │ ├── values-fr-rCH/ │ │ │ └── strings.xml │ │ ├── values-gsw/ │ │ │ └── strings.xml │ │ ├── values-it/ │ │ │ └── strings.xml │ │ ├── values-ja/ │ │ │ └── strings.xml │ │ ├── values-ko/ │ │ │ └── strings.xml │ │ ├── values-ln/ │ │ │ └── strings.xml │ │ ├── values-pt/ │ │ │ └── strings.xml │ │ ├── values-pt-rBR/ │ │ │ └── strings.xml │ │ ├── values-ru/ │ │ │ └── strings.xml │ │ ├── values-th/ │ │ │ └── strings.xml │ │ ├── values-vi/ │ │ │ └── strings.xml │ │ ├── values-zh/ │ │ │ └── strings.xml │ │ ├── values-zh-rCN/ │ │ │ └── strings.xml │ │ ├── values-zh-rHK/ │ │ │ └── strings.xml │ │ └── values-zh-rTW/ │ │ └── strings.xml │ └── storelisting_zh-TW.txt ├── settings.gradle.kts ├── shared/ │ ├── build.gradle.kts │ ├── consumer-proguard-rules.pro │ ├── google-services.json │ └── src/ │ ├── debugRelease/ │ │ └── java/ │ │ └── com/ │ │ └── google/ │ │ └── samples/ │ │ └── apps/ │ │ └── iosched/ │ │ └── shared/ │ │ └── di/ │ │ └── SharedModule.kt │ ├── main/ │ │ ├── AndroidManifest.xml │ │ ├── java/ │ │ │ └── com/ │ │ │ └── google/ │ │ │ └── samples/ │ │ │ └── apps/ │ │ │ └── iosched/ │ │ │ └── shared/ │ │ │ ├── analytics/ │ │ │ │ └── AnalyticsHelper.kt │ │ │ ├── data/ │ │ │ │ ├── BootstrapConferenceDataSource.kt │ │ │ │ ├── ConferenceDataDownloader.kt │ │ │ │ ├── ConferenceDataJsonParser.kt │ │ │ │ ├── ConferenceDataRepository.kt │ │ │ │ ├── ConferenceDataSource.kt │ │ │ │ ├── FirestoreExtensions.kt │ │ │ │ ├── NetworkConferenceDataSource.kt │ │ │ │ ├── agenda/ │ │ │ │ │ ├── AgendaBlocks.kt │ │ │ │ │ └── AgendaRepository.kt │ │ │ │ ├── ar/ │ │ │ │ │ └── ArDebugFlagEndpoint.kt │ │ │ │ ├── codelabs/ │ │ │ │ │ └── CodelabsRepository.kt │ │ │ │ ├── config/ │ │ │ │ │ ├── AppConfigDataSource.kt │ │ │ │ │ └── RemoteAppConfigDataSource.kt │ │ │ │ ├── db/ │ │ │ │ │ ├── AppDatabase.kt │ │ │ │ │ ├── CodelabFtsDao.kt │ │ │ │ │ ├── CodelabFtsEntity.kt │ │ │ │ │ ├── SessionFtsDao.kt │ │ │ │ │ ├── SessionFtsEntity.kt │ │ │ │ │ ├── SpeakerFtsDao.kt │ │ │ │ │ └── SpeakerFtsEntity.kt │ │ │ │ ├── feed/ │ │ │ │ │ ├── DefaultFeedRepository.kt │ │ │ │ │ ├── FirestoreAnnouncementDataSource.kt │ │ │ │ │ └── FirestoreMomentDataSource.kt │ │ │ │ ├── feedback/ │ │ │ │ │ └── FeedbackEndpoint.kt │ │ │ │ ├── job/ │ │ │ │ │ └── ConferenceDataService.kt │ │ │ │ ├── prefs/ │ │ │ │ │ └── PreferenceStorage.kt │ │ │ │ ├── session/ │ │ │ │ │ ├── SessionRepository.kt │ │ │ │ │ └── json/ │ │ │ │ │ ├── CodelabDeserializer.kt │ │ │ │ │ ├── CodelabTemp.kt │ │ │ │ │ ├── ColorDeserializer.kt │ │ │ │ │ ├── DeserializerUtils.kt │ │ │ │ │ ├── RoomDeserializer.kt │ │ │ │ │ ├── SessionDeserializer.kt │ │ │ │ │ ├── SessionTemp.kt │ │ │ │ │ ├── SpeakerDeserializer.kt │ │ │ │ │ └── TagDeserializer.kt │ │ │ │ ├── signin/ │ │ │ │ │ ├── AuthenticatedUserInfo.kt │ │ │ │ │ ├── AuthenticatedUserRegistration.kt │ │ │ │ │ ├── FirebaseRegisteredUserInfo.kt │ │ │ │ │ └── datasources/ │ │ │ │ │ ├── AuthIdDataSource.kt │ │ │ │ │ ├── AuthStateUserDataSource.kt │ │ │ │ │ ├── FirebaseAuthStateUserDataSource.kt │ │ │ │ │ ├── FirestoreRegisteredUserDataSource.kt │ │ │ │ │ └── RegisteredUserDataSource.kt │ │ │ │ ├── tag/ │ │ │ │ │ ├── TagDataSource.kt │ │ │ │ │ └── TagRepository.kt │ │ │ │ └── userevent/ │ │ │ │ ├── DefaultSessionAndUserEventRepository.kt │ │ │ │ ├── FirestoreUserEventDataSource.kt │ │ │ │ ├── FirestoreUserEventParser.kt │ │ │ │ ├── UserEventDataSource.kt │ │ │ │ └── UserEventsMessageGenerator.kt │ │ │ ├── di/ │ │ │ │ ├── CoroutinesQualifiers.kt │ │ │ │ ├── FeatureFlagAnnotations.kt │ │ │ │ ├── FeatureFlagsModule.kt │ │ │ │ └── MainThreadHandler.kt │ │ │ ├── domain/ │ │ │ │ ├── CoroutineUseCase.kt │ │ │ │ ├── FlowUseCase.kt │ │ │ │ ├── MediatorUseCase.kt │ │ │ │ ├── RefreshConferenceDataUseCase.kt │ │ │ │ ├── agenda/ │ │ │ │ │ └── LoadAgendaUseCase.kt │ │ │ │ ├── ar/ │ │ │ │ │ ├── ArConstants.kt │ │ │ │ │ └── LoadArDebugFlagUseCase.kt │ │ │ │ ├── auth/ │ │ │ │ │ └── ObserveUserAuthStateUseCase.kt │ │ │ │ ├── codelabs/ │ │ │ │ │ ├── GetCodelabsInfoCardShownUseCase.kt │ │ │ │ │ ├── LoadCodelabsUseCase.kt │ │ │ │ │ └── SetCodelabsInfoCardShownUseCase.kt │ │ │ │ ├── feed/ │ │ │ │ │ ├── GetConferenceStateUseCase.kt │ │ │ │ │ ├── LoadAnnouncementsUseCase.kt │ │ │ │ │ └── LoadCurrentMomentUseCase.kt │ │ │ │ ├── filters/ │ │ │ │ │ └── UserSessionFilterMatcher.kt │ │ │ │ ├── internal/ │ │ │ │ │ └── IOSchedHandler.kt │ │ │ │ ├── logistics/ │ │ │ │ │ └── LoadWifiInfoUseCase.kt │ │ │ │ ├── prefs/ │ │ │ │ │ ├── MarkScheduleUiHintsShownUseCase.kt │ │ │ │ │ ├── MyLocationOptedInUseCase.kt │ │ │ │ │ ├── NotificationsPrefIsShownUseCase.kt │ │ │ │ │ ├── NotificationsPrefSaveActionUseCase.kt │ │ │ │ │ ├── NotificationsPrefShownActionUseCase.kt │ │ │ │ │ ├── OnboardingCompleteActionUseCase.kt │ │ │ │ │ ├── OnboardingCompletedUseCase.kt │ │ │ │ │ ├── OptIntoMyLocationUseCase.kt │ │ │ │ │ ├── ScheduleUiHintsShownUseCase.kt │ │ │ │ │ └── StopSnackbarActionUseCase.kt │ │ │ │ ├── search/ │ │ │ │ │ ├── LoadSearchFiltersUseCase.kt │ │ │ │ │ ├── Searchable.kt │ │ │ │ │ ├── SessionSearchUseCase.kt │ │ │ │ │ └── SessionTextMatchStrategy.kt │ │ │ │ ├── sessions/ │ │ │ │ │ ├── ConferenceDayIndexer.kt │ │ │ │ │ ├── GetConferenceDaysUseCase.kt │ │ │ │ │ ├── LoadPinnedSessionsJsonUseCase.kt │ │ │ │ │ ├── LoadScheduleUserSessionsUseCase.kt │ │ │ │ │ ├── LoadSessionOneShotUseCase.kt │ │ │ │ │ ├── LoadSessionUseCase.kt │ │ │ │ │ ├── LoadStarredAndReservedSessionsUseCase.kt │ │ │ │ │ ├── LoadUserSessionOneShotUseCase.kt │ │ │ │ │ ├── LoadUserSessionUseCase.kt │ │ │ │ │ ├── LoadUserSessionsUseCase.kt │ │ │ │ │ ├── NotificationAlarmUpdater.kt │ │ │ │ │ └── ObserveConferenceDataUseCase.kt │ │ │ │ ├── settings/ │ │ │ │ │ ├── GetAnalyticsSettingUseCase.kt │ │ │ │ │ ├── GetAvailableThemesUseCase.kt │ │ │ │ │ ├── GetNotificationsSettingUseCase.kt │ │ │ │ │ ├── GetThemeUseCase.kt │ │ │ │ │ ├── GetTimeZoneUseCase.kt │ │ │ │ │ ├── ObserveThemeModeUseCase.kt │ │ │ │ │ ├── SetAnalyticsSettingUseCase.kt │ │ │ │ │ ├── SetThemeUseCase.kt │ │ │ │ │ └── SetTimeZoneUseCase.kt │ │ │ │ ├── speakers/ │ │ │ │ │ └── LoadSpeakerSessionsUseCase.kt │ │ │ │ └── users/ │ │ │ │ ├── FeedbackUseCase.kt │ │ │ │ ├── ReservationActionUseCase.kt │ │ │ │ ├── StarEventAndNotifyUseCase.kt │ │ │ │ └── SwapActionUseCase.kt │ │ │ ├── fcm/ │ │ │ │ ├── FcmTokenUpdater.kt │ │ │ │ ├── FcmTopicSubscriber.kt │ │ │ │ ├── IoschedFirebaseMessagingService.kt │ │ │ │ └── TopicSubscriber.kt │ │ │ ├── notifications/ │ │ │ │ ├── AlarmBroadcastReceiver.kt │ │ │ │ ├── CancelNotificationBroadcastReceiver.kt │ │ │ │ └── SessionAlarmManager.kt │ │ │ ├── result/ │ │ │ │ ├── Event.kt │ │ │ │ └── Result.kt │ │ │ ├── time/ │ │ │ │ └── DefaultTimeProvider.kt │ │ │ └── util/ │ │ │ ├── ColorUtils.kt │ │ │ ├── Extensions.kt │ │ │ ├── NetworkUtils.kt │ │ │ ├── SpeakerUtils.kt │ │ │ └── TimeUtils.kt │ │ ├── res/ │ │ │ ├── drawable/ │ │ │ │ ├── ic_default_avatar.xml │ │ │ │ ├── ic_event.xml │ │ │ │ ├── ic_launcher_background.xml │ │ │ │ ├── ic_livestreamed.xml │ │ │ │ ├── ic_notification_io_logo.xml │ │ │ │ ├── ic_star.xml │ │ │ │ ├── ic_star_border.xml │ │ │ │ └── tag_dot.xml │ │ │ ├── drawable-v24/ │ │ │ │ └── ic_launcher_foreground.xml │ │ │ ├── font/ │ │ │ │ ├── google_sans.xml │ │ │ │ └── google_sans_medium.xml │ │ │ ├── mipmap-anydpi-v26/ │ │ │ │ └── ic_launcher.xml │ │ │ ├── values/ │ │ │ │ ├── colors.xml │ │ │ │ ├── dimens.xml │ │ │ │ ├── font_certs.xml │ │ │ │ ├── preloaded_fonts.xml │ │ │ │ └── strings.xml │ │ │ ├── values-ar/ │ │ │ │ └── strings.xml │ │ │ ├── values-ar-rEG/ │ │ │ │ └── strings.xml │ │ │ ├── values-ar-rSA/ │ │ │ │ └── strings.xml │ │ │ ├── values-de/ │ │ │ │ └── strings.xml │ │ │ ├── values-de-rAT/ │ │ │ │ └── strings.xml │ │ │ ├── values-de-rCH/ │ │ │ │ └── strings.xml │ │ │ ├── values-es-rAR/ │ │ │ │ └── strings.xml │ │ │ ├── values-es-rBO/ │ │ │ │ └── strings.xml │ │ │ ├── values-es-rCL/ │ │ │ │ └── strings.xml │ │ │ ├── values-es-rCO/ │ │ │ │ └── strings.xml │ │ │ ├── values-es-rCR/ │ │ │ │ └── strings.xml │ │ │ ├── values-es-rDO/ │ │ │ │ └── strings.xml │ │ │ ├── values-es-rEC/ │ │ │ │ └── strings.xml │ │ │ ├── values-es-rGT/ │ │ │ │ └── strings.xml │ │ │ ├── values-es-rHN/ │ │ │ │ └── strings.xml │ │ │ ├── values-es-rMX/ │ │ │ │ └── strings.xml │ │ │ ├── values-es-rNI/ │ │ │ │ └── strings.xml │ │ │ ├── values-es-rPA/ │ │ │ │ └── strings.xml │ │ │ ├── values-es-rPE/ │ │ │ │ └── strings.xml │ │ │ ├── values-es-rPR/ │ │ │ │ └── strings.xml │ │ │ ├── values-es-rPY/ │ │ │ │ └── strings.xml │ │ │ ├── values-es-rSV/ │ │ │ │ └── strings.xml │ │ │ ├── values-es-rUS/ │ │ │ │ └── strings.xml │ │ │ ├── values-es-rUY/ │ │ │ │ └── strings.xml │ │ │ ├── values-es-rVE/ │ │ │ │ └── strings.xml │ │ │ ├── values-fa/ │ │ │ │ └── strings.xml │ │ │ ├── values-fr/ │ │ │ │ └── strings.xml │ │ │ ├── values-fr-rCH/ │ │ │ │ └── strings.xml │ │ │ ├── values-gsw/ │ │ │ │ └── strings.xml │ │ │ ├── values-it/ │ │ │ │ └── strings.xml │ │ │ ├── values-ja/ │ │ │ │ └── strings.xml │ │ │ ├── values-ko/ │ │ │ │ └── strings.xml │ │ │ ├── values-ln/ │ │ │ │ └── strings.xml │ │ │ ├── values-pt/ │ │ │ │ └── strings.xml │ │ │ ├── values-pt-rBR/ │ │ │ │ └── strings.xml │ │ │ ├── values-ru/ │ │ │ │ └── strings.xml │ │ │ ├── values-th/ │ │ │ │ └── strings.xml │ │ │ ├── values-vi/ │ │ │ │ └── strings.xml │ │ │ ├── values-zh/ │ │ │ │ └── strings.xml │ │ │ ├── values-zh-rCN/ │ │ │ │ └── strings.xml │ │ │ ├── values-zh-rHK/ │ │ │ │ └── strings.xml │ │ │ ├── values-zh-rTW/ │ │ │ │ └── strings.xml │ │ │ └── xml/ │ │ │ └── remote_config_defaults.xml │ │ └── resources/ │ │ └── conference_data_2019.json │ ├── release/ │ │ └── google-services.json │ ├── staging/ │ │ ├── java/ │ │ │ └── com/ │ │ │ └── google/ │ │ │ └── samples/ │ │ │ └── apps/ │ │ │ └── iosched/ │ │ │ └── shared/ │ │ │ ├── data/ │ │ │ │ ├── FakeAnnouncementDataSource.kt │ │ │ │ ├── FakeAppConfigDataSource.kt │ │ │ │ ├── FakeConferenceDataSource.kt │ │ │ │ ├── FakeFeedbackEndpoint.kt │ │ │ │ ├── ar/ │ │ │ │ │ └── FakeArDebugFlagEndpoint.kt │ │ │ │ ├── feed/ │ │ │ │ │ └── FakeMomentDataSource.kt │ │ │ │ └── userevent/ │ │ │ │ └── FakeUserEventDataSource.kt │ │ │ ├── di/ │ │ │ │ └── SharedModule.kt │ │ │ └── fcm/ │ │ │ └── StagingTopicSubscriber.kt │ │ └── res/ │ │ └── drawable/ │ │ └── staging_user_profile.xml │ └── test/ │ ├── java/ │ │ └── com/ │ │ └── google/ │ │ └── samples/ │ │ └── apps/ │ │ └── iosched/ │ │ ├── firestore/ │ │ │ └── entity/ │ │ │ ├── ReservationRequestResultTest.kt │ │ │ └── UserEventTest.kt │ │ ├── shared/ │ │ │ ├── data/ │ │ │ │ ├── BootstrapConferenceDataSourceTest.kt │ │ │ │ ├── ConferenceDataJsonParserTest.kt │ │ │ │ ├── ConferenceDataRepositoryTest.kt │ │ │ │ ├── signin/ │ │ │ │ │ └── ObserveUserAuthStateUseCaseTest.kt │ │ │ │ └── userevent/ │ │ │ │ ├── CompareOldAndNewUserEventsTest.kt │ │ │ │ └── DefaultSessionAndUserEventRepositoryTest.kt │ │ │ ├── domain/ │ │ │ │ ├── FlowUseCaseTest.kt │ │ │ │ ├── codelabs/ │ │ │ │ │ └── LoadCodelabsUseCaseTest.kt │ │ │ │ ├── feed/ │ │ │ │ │ ├── GetConferenceStateUseCaseTest.kt │ │ │ │ │ ├── LoadAnnouncementsUseCaseTest.kt │ │ │ │ │ ├── LoadCurrentMomentUseCaseTest.kt │ │ │ │ │ ├── TestAnnouncementDataSource.kt │ │ │ │ │ └── TestMomentDataSource.kt │ │ │ │ ├── filters/ │ │ │ │ │ └── UserSessionFilterMatcherTest.kt │ │ │ │ ├── repository/ │ │ │ │ │ └── TestUserEventDataSource.kt │ │ │ │ ├── search/ │ │ │ │ │ ├── LoadSearchFiltersUseCaseTest.kt │ │ │ │ │ └── SessionTextMatchStrategyTest.kt │ │ │ │ ├── sessions/ │ │ │ │ │ ├── LoadPinnedSessionsJsonUseCaseTest.kt │ │ │ │ │ ├── LoadScheduleUserSessionsUseCaseTest.kt │ │ │ │ │ ├── LoadStarredAndReservedSessionsUseCaseTest.kt │ │ │ │ │ └── ObserveConferenceDataUseCaseTest.kt │ │ │ │ └── users/ │ │ │ │ ├── FeedbackUseCaseTest.kt │ │ │ │ ├── ReservationActionUseCaseTest.kt │ │ │ │ └── StarEventUseCaseTest.kt │ │ │ ├── model/ │ │ │ │ ├── SessionTest.kt │ │ │ │ ├── SharedTestData.kt │ │ │ │ └── TagTest.kt │ │ │ └── util/ │ │ │ ├── ColorUtilsTest.kt │ │ │ ├── SpeakerUtilsTest.kt │ │ │ └── TimeUtilsTest.kt │ │ └── test/ │ │ └── util/ │ │ ├── FakeAppDatabase.kt │ │ └── FakePreferenceStorage.kt │ └── resources/ │ ├── malformed_conference_data.json │ └── test_conference_data1.json ├── test-shared/ │ ├── build.gradle.kts │ └── src/ │ └── main/ │ └── java/ │ └── com/ │ └── google/ │ └── samples/ │ └── apps/ │ └── iosched/ │ └── test/ │ └── data/ │ ├── MainCoroutineRule.kt │ └── TestData.kt └── tools/ ├── iosched-codestyle.xml ├── pre-push └── setup.sh ================================================ FILE CONTENTS ================================================ ================================================ FILE: .github/ci-gradle.properties ================================================ # # Copyright 2020 The Android Open Source Project # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # org.gradle.daemon=false org.gradle.parallel=true org.gradle.jvmargs=-Xmx5120m org.gradle.workers.max=2 kotlin.incremental=false kotlin.compiler.execution.strategy=in-process ================================================ FILE: .github/workflows/iosched.yaml ================================================ name: iosched on: push: branches: - main - compose pull_request: branches: - main - compose jobs: build: runs-on: ubuntu-latest timeout-minutes: 30 steps: - name: Checkout uses: actions/checkout@v2 - name: Copy CI gradle.properties run: mkdir -p ~/.gradle ; cp .github/ci-gradle.properties ~/.gradle/gradle.properties - name: Set up JDK 11 uses: actions/setup-java@v1 with: java-version: 11 - uses: actions/cache@v2 with: path: | ~/.gradle/caches/modules-* ~/.gradle/caches/jars-* ~/.gradle/caches/build-cache-* key: gradle-${{ hashFiles('checksum.txt') }} - name: Build project run: ./gradlew spotlessCheck assembleDebug --stacktrace - name: Upload build reports if: always() uses: actions/upload-artifact@v2 with: name: build-reports path: mobile/build/reports/ test: runs-on: macOS-latest # enables hardware acceleration in the virtual machine timeout-minutes: 30 strategy: matrix: api-level: [23, 26, 29] steps: - name: Checkout uses: actions/checkout@v2 - name: Copy CI gradle.properties run: mkdir -p ~/.gradle ; cp .github/ci-gradle.properties ~/.gradle/gradle.properties - name: Set up JDK 11 uses: actions/setup-java@v1 with: java-version: 11 - name: Run instrumentation tests uses: reactivecircus/android-emulator-runner@v2 with: api-level: ${{ matrix.api-level }} arch: x86 disable-animations: true script: ./gradlew mobile:cAT --stacktrace - name: Upload test reports if: always() uses: actions/upload-artifact@v2 with: name: test-reports path: mobile/build/reports/ ================================================ FILE: .gitignore ================================================ # built application files *.apk *.ap_ # files for the dex VM *.dex # Java class files *.class # generated files bin/ gen/ out/ build/ # Local configuration file (sdk path, etc) local.properties # Eclipse project files .classpath .project # Windows thumbnail db .DS_Store # IDEA/Android Studio project files, because # the project can be imported from settings.gradle.kts *.iml .idea/* !.idea/copyright !.idea/codeStyles/codeStyleConfig.xml # Gradle cache .gradle # Sandbox stuff _sandbox # Android Studio captures folder captures/ ================================================ FILE: .idea/copyright/iosched.xml ================================================ ================================================ FILE: .idea/copyright/profiles_settings.xml ================================================ ================================================ FILE: CONTRIBUTING.md ================================================ # How to become a contributor and submit your own code ## Contributor License Agreements We'd love to accept your sample apps and patches! Before we can take them, we have to jump a couple of legal hurdles. Please fill out either the individual or corporate Contributor License Agreement (CLA). * If you are an individual writing original source code and you're sure you own the intellectual property, then you'll need to sign an [individual CLA] (https://developers.google.com/open-source/cla/individual). * If you work for a company that wants to allow you to contribute your work, then you'll need to sign a [corporate CLA] (https://developers.google.com/open-source/cla/corporate). Follow either of the two links above to access the appropriate CLA and instructions for how to sign and return it. Once we receive it, we'll be able to accept your pull requests. ## Contributing A Patch 1. Submit an issue describing your proposed change to the repo in question. 1. The repo owner will respond to your issue promptly. 1. If your proposed change is accepted, and you haven't already done so, sign a Contributor License Agreement (see details above). 1. Fork the desired repo, develop and test your code changes. 1. Ensure that your code adheres to the existing style in the sample to which you are contributing. Refer to the [Google Cloud Platform Samples Style Guide] (https://github.com/GoogleCloudPlatform/Template/wiki/style.html) for the recommended coding standards for this organization. 1. Ensure that your code has an appropriate set of unit tests which all pass. 1. Submit a pull request. ================================================ FILE: LICENSE ================================================ Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright [yyyy] [name of copyright owner] Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. ================================================ FILE: README.md ================================================ Google I/O Android App (ARCHIVED) ====================== ## 2023 Update **This repository has been archived.** The Google I/O app has guided online and in-person visitors through the Google I/O conference for 10 years since 2009. It has also helped thousands of developers as an open-source sample. To follow Modern Android Development best practices, check out the [Now in Android](https://github.com/android/nowinandroid) repository, which replaces iosched as our real-world sample. ## 2021 Update **Due to global events, Google I/O 2020 was canceled and Google I/O 2021 is an online-only event, so the companion app hasn't been updated since 2019. However, the `iosched` team has continued adding several architecture improvements to its codebase. The general look and feel of the app is unchanged, and the app still uses the data from Google I/O 2019.** Major improvements implemented in 2021: * Migration from LiveData to Kotlin Flows to observe data. * Support for large screens and other form factors. * Migration from SharedPreferences to [Jetpack DataStore](https://developer.android.com/topic/libraries/architecture/datastore). * (Experimental) Partial migration to Jetpack Compose (in the [`compose`](https://github.com/google/iosched/tree/compose) branch) # Description Google I/O is a developer conference with several days of deep technical content featuring technical sessions and hundreds of demonstrations from developers showcasing their technologies. This project is the Android app for the conference. # Running the app The project contains a `staging` variant that replaces some modules at compile time so they don't depend on remote services such as Firebase. This allows you to try out and test the app without the API keys. # Features The app displays a list of conference events - sessions, office hours, app reviews, codelabs, etc. - and allows the user to filter these events by event types and by topics (Android, Firebase, etc.). Users can see details about events, and they can star events that interest them. Conference attendees can reserve events to guarantee a seat. Other features include a Map of the venue, informational pages to guide attendees during the conference in Info, and time-relevant information during the conference in Home.
Schedule screenshot
# Development Environment The app is written entirely in Kotlin and uses the Gradle build system. To build the app, use the `gradlew build` command or use "Import Project" in Android Studio. Android Studio Arctic Fox or newer is required and may be downloaded [here](https://developer.android.com/studio/preview). # Architecture The architecture is built around [Android Architecture Components](https://developer.android.com/topic/libraries/architecture/) and follows the recommendations laid out in the [Guide to App Architecture](https://developer.android.com/jetpack/docs/guide). Logic is kept away from Activities and Fragments and moved to [ViewModel](https://developer.android.com/topic/libraries/architecture/viewmodel)s. Data is observed using [Kotlin Flows](https://developer.android.com/kotlin/flow/stateflow-and-sharedflow) and the [Data Binding Library](https://developer.android.com/topic/libraries/data-binding/) binds UI components in layouts to the app's data sources. The Repository layer handles data operations. IOSched's data comes from a few different sources - user data is stored in [Cloud Firestore](https://firebase.google.com/docs/firestore/) (either remotely or in a local cache for offline use), user preferences and settings are stored in DataStore, conference data is stored remotely and is fetched and stored in memory for the app to use, etc. - and the repository modules are responsible for handling all data operations and abstracting the data sources from the rest of the app. A lightweight domain layer sits between the data layer and the presentation layer, and handles discrete pieces of business logic off the UI thread. See the `.\*UseCase.kt` files under `shared/domain` for [examples](https://github.com/google/iosched/search?q=UseCase&unscoped_q=UseCase). The [Navigation component](https://developer.android.com/guide/navigation) is used to implement navigation in the app, handling Fragment transactions and providing a consistent user experience. [Room](https://developer.android.com/jetpack/androidx/releases/room) is used for Full Text Search using [Fts4](https://developer.android.com/reference/androidx/room/Fts4) to search for a session, speaker, or codelab. UI tests are written with [Espresso](https://developer.android.com/training/testing/espresso/) and unit tests use Junit4 with [Mockito](https://github.com/mockito/mockito) when necessary. The [Jetpack Benchmark library](https://developer.android.com/studio/profile/benchmark) makes it easy to benchmark your code from within Android Studio. The library handles warmup, measures your code performance, and outputs benchmarking results to the Android Studio console. We added a few benchmark tests around critical paths during app startup - in particular, the parsing of the bootstrap data. This enables us to automate measuring and monitoring initial startup time. Here is an example from a benchmark run: ``` Started running tests Connected to process 30763 on device 'google-pixel_3'. benchmark: benchmark: 76,076,101 ns BootstrapConferenceDataSourceBenchmark.benchmark_json_parsing Tests ran to completion. ``` Dependency Injection is implemented with [Hilt](https://developer.android.com/training/dependency-injection/hilt-android). For more details on migrating from *dagger-android* to Hilt, read the ([migration article](https://medium.com/androiddevelopers/migrating-the-google-i-o-app-to-hilt-f3edf03affe5). [ViewPager2](https://developer.android.com/training/animation/screen-slide-2) offers enhanced functionality over the original ViewPager library, such as right-to-left and vertical orientation support. For more details on migrating from ViewPager to ViewPager2, please see this [migration guide](https://developer.android.com/training/animation/vp2-migration). ## Firebase The app makes considerable use of the following Firebase components: - [Cloud Firestore](https://firebase.google.com/docs/firestore/) is our source for all user data (events starred or reserved by a user). Firestore gave us automatic sync and also seamlessly managed offline functionality for us. - [Firebase Cloud Functions](https://firebase.google.com/docs/functions/) allowed us to run backend code. The reservations feature heavily depended on Cloud Functions working in conjuction with Firestore. - [Firebase Cloud Messaging](https://firebase.google.com/docs/cloud-messaging/concept-options) let us inform the app about changes to conference data on our server. - [Remote Config](https://firebase.google.com/docs/remote-config/) helped us manage in-app constants. For 2020, the implementation was migrated to the Firebase Kotlin extension (KTX) libraries to write more idiomatic Kotlin code when calling Firebase APIs. To learn more, read this [Firebase blog article](https://firebase.googleblog.com/2020/03/firebase-kotlin-ga.html) on the Firebase KTX libraries. ## Kotlin The app is entirely written in Kotlin and uses Jetpack's [Android Ktx extensions](https://developer.android.com/kotlin/ktx). Asynchronous tasks are handled with [coroutines](https://developer.android.com/kotlin/coroutines). Coroutines allow for simple and safe management of one-shot operations as well as building and consuming streams of data using [Kotlin Flows](https://developer.android.com/kotlin/flow). All build scripts are written with the [Kotlin DSL](https://docs.gradle.org/current/userguide/kotlin_dsl.html). # Copyright Copyright 2014 Google Inc. All rights reserved. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. ================================================ FILE: androidTest-shared/build.gradle.kts ================================================ /* * Copyright 2020 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ plugins { id("com.android.library") kotlin("android") } android { compileSdk = Versions.COMPILE_SDK defaultConfig { minSdk = Versions.MIN_SDK targetSdk = Versions.TARGET_SDK testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" } lint { // Version changes are beyond our control, so don't warn. The IDE will still mark these. disable += "GradleDependency" } } dependencies { api(platform(project(":depconstraints"))) implementation(Libs.KOTLIN_STDLIB) // Architecture Components implementation(Libs.LIFECYCLE_LIVE_DATA_KTX) implementation(Libs.LIFECYCLE_VIEW_MODEL_KTX) } ================================================ FILE: androidTest-shared/src/main/AndroidManifest.xml ================================================ ================================================ FILE: androidTest-shared/src/main/java/com/google/samples/apps/iosched/androidtest/util/LiveDataTestUtil.kt ================================================ /* * Copyright 2018 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.androidtest.util import androidx.lifecycle.LiveData import androidx.lifecycle.Observer import java.util.concurrent.CountDownLatch import java.util.concurrent.TimeUnit /** * Safely handles observables from LiveData for testing. */ object LiveDataTestUtil { /** * Gets the value of a LiveData safely. */ @Throws(InterruptedException::class) fun getValue(liveData: LiveData): T? { var data: T? = null val latch = CountDownLatch(1) val observer = object : Observer { override fun onChanged(o: T?) { data = o latch.countDown() liveData.removeObserver(this) } } liveData.observeForever(observer) latch.await(2, TimeUnit.SECONDS) return data } } /** * Observes a [LiveData] until the `block` is done executing. */ fun LiveData.observeForTesting(block: () -> Unit) { val observer = Observer { } try { observeForever(observer) block() } finally { removeObserver(observer) } } ================================================ FILE: ar/build.gradle.kts ================================================ /* * Copyright 2022 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ plugins { id("com.android.library") kotlin("android") kotlin("kapt") } android { compileSdk = Versions.COMPILE_SDK defaultConfig { minSdk = Versions.MIN_SDK targetSdk = Versions.TARGET_SDK testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" consumerProguardFiles("consumer-proguard-rules.pro") } buildTypes { maybeCreate("staging") getByName("staging") { initWith(getByName("debug")) // Specifies a sorted list of fallback build types that the // plugin should try to use when a dependency does not include a // "staging" build type. // Used with :test-shared, which doesn't have a staging variant. matchingFallbacks += listOf("debug") } maybeCreate("benchmark") getByName("benchmark") { initWith(getByName("staging")) // Specifies a sorted list of fallback build types that the // plugin should try to use when a dependency does not include a // "staging" build type. // Used with :test-shared, which doesn't have a staging variant. matchingFallbacks += listOf("staging", "debug") } } lint { disable += "InvalidPackage" // Version changes are beyond our control, so don't warn. The IDE will still mark these. disable += "GradleDependency" } // Required by ArWebView compileOptions { sourceCompatibility = JavaVersion.VERSION_1_8 targetCompatibility = JavaVersion.VERSION_1_8 } } dependencies { api(platform(project(":depconstraints"))) implementation(project(":shared")) implementation(Libs.APPCOMPAT) implementation(Libs.ARCORE) implementation(Libs.GOOGLE_PLAY_SERVICES_VISION) implementation(Libs.KOTLIN_STDLIB) } ================================================ FILE: ar/consumer-proguard-rules.pro ================================================ # Copyright 2019 Google LLC # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # https://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # Proguard configuration for the AR feature -keep class com.google.ar.web.** { *; } -dontwarn com.google.ar.web.** ================================================ FILE: ar/src/main/AndroidManifest.xml ================================================ ================================================ FILE: ar/src/main/java/com/google/samples/apps/iosched/ar/ArActivity.kt ================================================ /* * Copyright 2019 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.ar import android.os.Bundle import android.view.WindowManager import android.webkit.WebView import android.webkit.WebViewClient import androidx.appcompat.app.AppCompatActivity import com.google.samples.apps.iosched.shared.domain.ar.ArConstants class ArActivity : AppCompatActivity() { private lateinit var arWebView: WebView override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) val pinnedSessionsJson = intent?.extras?.getString(ArConstants.PINNED_SESSIONS_JSON_KEY, "") ?: "" val canSignedInUserDemoAr = intent?.extras?.getBoolean(ArConstants.CAN_SIGNED_IN_USER_DEMO_AR, false) ?: false arWebView = WebView(this) setContentView(arWebView) arWebView.apply { webViewClient = ArWebViewClient(pinnedSessionsJson, canSignedInUserDemoAr) settings.apply { mediaPlaybackRequiresUserGesture = false domStorageEnabled = true databaseEnabled = true } // Loading a single entry point because all the user flow happens in JavaScript from the // teaser page and requesting ARCore apk and camera permission loadUrl("https://sp-io2019.appspot.com/") } window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON) } override fun onRestart() { super.onRestart() arWebView.reload() } override fun onStop() { super.onStop() val addOverlayScript = "if (window.app && window.app.addIntroOverlay) " + "window.app.addIntroOverlay();" arWebView.evaluateJavascript(addOverlayScript) {} } override fun onDestroy() { arWebView.destroy() window.clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON) super.onDestroy() } /** * WebViewClient that sends the pinned sessions as json to the WebView. * Defining it as a class otherwise an anonymous class was stripped from proguard. */ private class ArWebViewClient( val json: String, val canDemoAr: Boolean ) : WebViewClient() { override fun onPageFinished(view: WebView?, url: String?) { super.onPageFinished(view, url) val evalAgendaScript = "if (window.app && window.app.sendIOAppUserAgenda) " + "window.app.sendIOAppUserAgenda('$json');" view?.evaluateJavascript(evalAgendaScript) {} if (canDemoAr) { val evalSetDebugUserScript = "if (window.app && window.app.setDebugUser) " + "window.app.setDebugUser()" view?.evaluateJavascript(evalSetDebugUserScript) {} } } } } ================================================ FILE: ar/src/main/res/values/styles.xml ================================================ ================================================ FILE: benchmark/build.gradle.kts ================================================ /* * Copyright 2022 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ plugins { id("com.android.library") kotlin("android") id("androidx.benchmark") kotlin("kapt") } android { compileSdk = Versions.COMPILE_SDK defaultConfig { minSdk = Versions.MIN_SDK targetSdk = Versions.TARGET_SDK testInstrumentationRunner = "androidx.benchmark.junit4.AndroidBenchmarkRunner" } buildTypes { maybeCreate("benchmark") getByName("benchmark") { initWith(getByName("release")) signingConfig = signingConfigs.getByName("debug") isDefault = true isMinifyEnabled = true proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt")) // Specifies a sorted list of fallback build types that the // plugin should try to use when a dependency does not include a // "staging" build type. // Used with :test-shared, which doesn't have a staging variant. matchingFallbacks += listOf("staging", "debug") } } testBuildType = "benchmark" // To avoid the compile error from benchmarkRule.measureRepeated // Cannot inline bytecode built with JVM target 1.8 into bytecode that is being built with JVM // target 1.6 kotlinOptions.jvmTarget = "1.8" packagingOptions { resources.excludes += "META-INF/AL2.0" resources.excludes += "META-INF/LGPL2.1" } } dependencies { androidTestImplementation(platform(project(":depconstraints"))) kapt(platform(project(":depconstraints"))) androidTestImplementation(project(":model")) androidTestImplementation(project(":shared")) androidTestImplementation(project(":test-shared")) androidTestImplementation(project(":androidTest-shared")) // ThreeTenBP is for Date and time API for Java. androidTestImplementation(Libs.THREETENABP) // Instrumentation tests androidTestImplementation(Libs.HAMCREST) androidTestImplementation(Libs.EXT_JUNIT) androidTestImplementation(Libs.RUNNER) androidTestImplementation(Libs.RULES) // Benchmark testing androidTestImplementation(Libs.BENCHMARK) } ================================================ FILE: benchmark/src/androidTest/AndroidManifest.xml ================================================ ================================================ FILE: benchmark/src/androidTest/java/com/google/samples/apps/iosched/benchmark/BootstrapConferenceDataSourceBenchmark.kt ================================================ /* * Copyright 2020 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.benchmark import androidx.benchmark.junit4.BenchmarkRule import androidx.benchmark.junit4.measureRepeated import androidx.test.ext.junit.runners.AndroidJUnit4 import com.google.samples.apps.iosched.shared.data.BootstrapConferenceDataSource import org.hamcrest.core.IsNot.not import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith /** * Benchmark test for parsing offline data. To keep startup times optimized, this benchmark * test is used to monitor potential hot spots when the app first loads content. */ @RunWith(AndroidJUnit4::class) class BootstrapConferenceDataSourceBenchmark { @get:Rule val benchmarkRule = BenchmarkRule() // Parsing JSON data can be quite time consuming. We have custom deserializers to improve the // performance. We parse this data when the app starts up which is a critical user path. This // benchmark is to ensure we maintain the level of quality around bootstrapping data to minimize // the app startup latency. Note that loadAndParseBootstrapData() also normalizes after it has // been parsed. @Test fun benchmark_json_parsing() = benchmarkRule.measureRepeated { BootstrapConferenceDataSource.loadAndParseBootstrapData() } } ================================================ FILE: benchmark/src/androidTest/java/com/google/samples/apps/iosched/benchmark/LoadAgendaUseCaseBenchmark.kt ================================================ /* * Copyright 2020 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.benchmark import androidx.benchmark.junit4.BenchmarkRule import androidx.benchmark.junit4.measureRepeated import androidx.test.core.app.ApplicationProvider import androidx.test.ext.junit.runners.AndroidJUnit4 import com.google.samples.apps.iosched.model.Block import com.google.samples.apps.iosched.shared.data.FakeAppConfigDataSource import com.google.samples.apps.iosched.shared.data.agenda.DefaultAgendaRepository import com.google.samples.apps.iosched.shared.domain.agenda.LoadAgendaUseCase import com.google.samples.apps.iosched.shared.result.Result import com.google.samples.apps.iosched.shared.result.data import com.google.samples.apps.iosched.shared.result.succeeded import com.google.samples.apps.iosched.test.data.MainCoroutineRule import com.jakewharton.threetenabp.AndroidThreeTen import kotlinx.coroutines.test.runTest import org.hamcrest.MatcherAssert.assertThat import org.hamcrest.collection.IsCollectionWithSize.hasSize import org.hamcrest.core.Is.`is` import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith /** * Simple benchmark test for loading the agenda. To keep startup times optimized, this benchmark * test is used to monitor potential hot spots when the app first loads content. */ @RunWith(AndroidJUnit4::class) class LoadAgendaUseCaseBenchmark { @get:Rule val benchmarkRule = BenchmarkRule() @get:Rule var coroutineRule = MainCoroutineRule() @Test fun loadAgendaUseCase() { AndroidThreeTen.init(ApplicationProvider.getApplicationContext()) // Using FakeAppConfigDataSource to stub out the network call to Firebase's remote config. // The repository and useCase do not perform any caching so the creation of the useCase // occurs before measuring to focus the benchmark on the creation of the agenda. val useCase = LoadAgendaUseCase( DefaultAgendaRepository(FakeAppConfigDataSource()), coroutineRule.testDispatcher ) benchmarkRule.measureRepeated { runTest { val result: Result> = useCase.invoke(parameters = true) assertThat(result.succeeded, `is`(true)) assertThat(result.data, hasSize(29)) } } } } ================================================ FILE: benchmark/src/main/AndroidManifest.xml ================================================ ================================================ FILE: build.gradle.kts ================================================ /* * Copyright 2020 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ // Top-level build file where you can add configuration options common to all // sub-projects/modules. import org.jetbrains.kotlin.gradle.tasks.KotlinCompile buildscript { repositories { google() mavenCentral() jcenter() // Android Build Server maven { url = uri("../iosched-prebuilts/m2repository") } } dependencies { classpath("com.android.tools.build:gradle:${Versions.ANDROID_GRADLE_PLUGIN}") classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:${Versions.KOTLIN}") classpath("com.google.gms:google-services:${Versions.GOOGLE_SERVICES}") classpath("androidx.benchmark:benchmark-gradle-plugin:${Versions.BENCHMARK}") classpath("androidx.navigation:navigation-safe-args-gradle-plugin:${Versions.NAVIGATION}") classpath("com.google.firebase:firebase-crashlytics-gradle:${Versions.FIREBASE_CRASHLYTICS}") classpath("com.google.dagger:hilt-android-gradle-plugin:${Versions.HILT_AGP}") } } plugins { id("com.diffplug.gradle.spotless") version "3.27.1" } allprojects { repositories { google() mavenCentral() jcenter() // For Android Build Server // - Material Design Components maven { url = uri("${project.rootDir}/../iosched-prebuilts/repository") } // - Other dependencies maven { url = uri("${project.rootDir}/../iosched-prebuilts/m2repository") } // - Support Libraries, etc maven { url = uri("${project.rootDir}/../../../prebuilts/fullsdk/linux/extras/support/m2repository") } flatDir { dirs = setOf(file("libs"), project(":ar").file("libs")) } } } subprojects { apply(plugin = "com.diffplug.gradle.spotless") val ktlintVer = "0.40.0" spotless { kotlin { target("**/*.kt") ktlint(ktlintVer).userData( mapOf("max_line_length" to "100", "disabled_rules" to "import-ordering") ) licenseHeaderFile(project.rootProject.file("copyright.kt")) } kotlinGradle { // same as kotlin, but for .gradle.kts files (defaults to '*.gradle.kts') target("**/*.gradle.kts") ktlint(ktlintVer) licenseHeaderFile(project.rootProject.file("copyright.kt"), "(plugins |import |include)") } } // `spotlessCheck` runs when a build includes `check`, notably during presubmit. In these cases // we prefer `spotlessCheck` run as early as possible since it fails in seconds. This prevents a // build from running for several minutes doing other intensive tasks (resource processing, code // generation, compilation, etc) only to fail on a formatting nit. // Using `mustRunAfter` avoids creating a task dependency. The order is enforced only if // `spotlessCheck` is already scheduled to run, so we can still build and launch from the IDE // while the code is "dirty". tasks.whenTaskAdded { if (name == "preBuild") { mustRunAfter("spotlessCheck") } } // TODO: Remove when the Coroutine and Flow APIs leave experimental/internal/preview. tasks.withType().configureEach { kotlinOptions.freeCompilerArgs += "-Xuse-experimental=kotlinx.coroutines.ExperimentalCoroutinesApi" } } ================================================ FILE: buildSrc/build.gradle.kts ================================================ /* * Copyright 2020 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ plugins { `kotlin-dsl` } repositories { gradlePluginPortal() } ================================================ FILE: buildSrc/src/main/java/Libs.kt ================================================ /* * Copyright 2020 Google LLC. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ object Libs { const val ACTIVITY_COMPOSE = "androidx.activity:activity-compose" const val ACTIVITY_KTX = "androidx.activity:activity-ktx" const val APPCOMPAT = "androidx.appcompat:appcompat" const val APP_STARTUP = "androidx.startup:startup-runtime" const val ARCH_TESTING = "androidx.arch.core:core-testing" const val ARCORE = "com.google.ar:core" const val BENCHMARK = "androidx.benchmark:benchmark-junit4" const val BENCHMARK_MACRO = "androidx.benchmark:benchmark-macro-junit4" const val BROWSER = "androidx.browser:browser" const val CARDVIEW = "androidx.cardview:cardview" const val CONSTRAINT_LAYOUT = "androidx.constraintlayout:constraintlayout" const val CORE_KTX = "androidx.core:core-ktx" const val CRASHLYTICS = "com.google.firebase:firebase-crashlytics" const val COMPOSE_ANIMATION = "androidx.compose.animation:animation" const val COMPOSE_MATERIAL = "androidx.compose.material:material" const val COMPOSE_RUNTIME = "androidx.compose.runtime:runtime" const val COMPOSE_TEST = "androidx.compose.ui:ui-test-junit4" const val COMPOSE_THEME_ADAPTER = "com.google.android.material:compose-theme-adapter" const val COMPOSE_TOOLING = "androidx.compose.ui:ui-tooling" const val COROUTINES = "org.jetbrains.kotlinx:kotlinx-coroutines-core" const val COROUTINES_TEST = "org.jetbrains.kotlinx:kotlinx-coroutines-test" const val DATA_STORE_PREFERENCES = "androidx.datastore:datastore-preferences" const val DRAWER_LAYOUT = "androidx.drawerlayout:drawerlayout" const val ESPRESSO_CONTRIB = "androidx.test.espresso:espresso-contrib" const val ESPRESSO_CORE = "androidx.test.espresso:espresso-core" const val EXT_JUNIT = "androidx.test.ext:junit" const val FIREBASE_ANALYTICS = "com.google.firebase:firebase-analytics-ktx" const val FIREBASE_AUTH = "com.google.firebase:firebase-auth-ktx" const val FIREBASE_CONFIG = "com.google.firebase:firebase-config-ktx" const val FIREBASE_FIRESTORE = "com.google.firebase:firebase-firestore-ktx" const val FIREBASE_FUNCTIONS = "com.google.firebase:firebase-functions-ktx" const val FIREBASE_MESSAGING = "com.google.firebase:firebase-messaging" const val FIREBASE_UI_AUTH = "com.firebaseui:firebase-ui-auth" const val FLEXBOX = "com.google.android:flexbox" const val FRAGMENT_KTX = "androidx.fragment:fragment-ktx" const val FRAGMENT_TEST = "androidx.fragment:fragment-testing" const val GLIDE = "com.github.bumptech.glide:glide" const val GLIDE_COMPILER = "com.github.bumptech.glide:compiler" const val GOOGLE_MAP_UTILS_KTX = "com.google.maps.android:maps-utils-ktx" const val GOOGLE_PLAY_SERVICES_MAPS_KTX = "com.google.maps.android:maps-ktx" const val GOOGLE_PLAY_SERVICES_VISION = "com.google.android.gms:play-services-vision" const val GSON = "com.google.code.gson:gson" const val HAMCREST = "org.hamcrest:hamcrest-library" const val HILT_ANDROID = "com.google.dagger:hilt-android" const val HILT_COMPILER = "com.google.dagger:hilt-android-compiler" const val HILT_TESTING = "com.google.dagger:hilt-android-testing" const val INK_PAGE_INDICATOR = "com.pacioianu.david:ink-page-indicator" const val JUNIT = "junit:junit" const val KOTLIN_STDLIB = "org.jetbrains.kotlin:kotlin-stdlib-jdk7" const val LIFECYCLE_COMPILER = "androidx.lifecycle:lifecycle-compiler" const val LIFECYCLE_LIVE_DATA_KTX = "androidx.lifecycle:lifecycle-livedata-ktx" const val LIFECYCLE_RUNTIME_KTX = "androidx.lifecycle:lifecycle-runtime-ktx" const val LIFECYCLE_VIEW_MODEL_KTX = "androidx.lifecycle:lifecycle-viewmodel-ktx" const val LOTTIE = "com.airbnb.android:lottie" const val MATERIAL = "com.google.android.material:material" const val MDC_COMPOSE_THEME_ADAPTER = "com.google.android.material:compose-theme-adapter" const val MOCKITO_CORE = "org.mockito:mockito-core" const val MOCKITO_KOTLIN = "com.nhaarman:mockito-kotlin" const val NAVIGATION_FRAGMENT_KTX = "androidx.navigation:navigation-fragment-ktx" const val NAVIGATION_UI_KTX = "androidx.navigation:navigation-ui-ktx" const val OKHTTP = "com.squareup.okhttp3:okhttp" const val OKHTTP_LOGGING_INTERCEPTOR = "com.squareup.okhttp3:logging-interceptor" const val OKIO = "com.squareup.okio:okio" const val PROFILE_INSTALLER = "androidx.profileinstaller:profileinstaller" const val ROOM_COMPILER = "androidx.room:room-compiler" const val ROOM_KTX = "androidx.room:room-ktx" const val ROOM_RUNTIME = "androidx.room:room-runtime" const val RULES = "androidx.test:rules" const val RUNNER = "androidx.test:runner" const val SLIDING_PANE_LAYOUT = "androidx.slidingpanelayout:slidingpanelayout" const val THREETENABP = "com.jakewharton.threetenabp:threetenabp" const val THREETENBP = "org.threeten:threetenbp" const val TIMBER = "com.jakewharton.timber:timber" const val UI_AUTOMATOR = "androidx.test.uiautomator:uiautomator" const val VIEWMODEL_COMPOSE = "androidx.lifecycle:lifecycle-viewmodel-compose" const val VIEWPAGER2 = "androidx.viewpager2:viewpager2" } ================================================ FILE: buildSrc/src/main/java/Versions.kt ================================================ /* * Copyright 2020 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ object Versions { val versionName = "7.0.15" // X.Y.Z; X = Major, Y = minor, Z = Patch level private val versionCodeBase = 70150 // XYYZZM; M = Module (tv, mobile) val versionCodeMobile = versionCodeBase + 3 const val COMPILE_SDK = 31 const val TARGET_SDK = 30 const val MIN_SDK = 21 const val ANDROID_GRADLE_PLUGIN = "7.2.0" const val BENCHMARK = "1.1.0-rc02" const val COMPOSE = "1.1.1" const val FIREBASE_CRASHLYTICS = "2.3.0" const val GOOGLE_SERVICES = "4.3.3" const val HILT_AGP = "2.40.5" const val KOTLIN = "1.6.10" const val NAVIGATION = "2.4.1" const val PROFILE_INSTALLER = "1.2.0-beta01" // TODO: Remove this once the version for // "org.threeten:threetenbp:${Versions.threetenbp}:no-tzdb" using java-platform in the // depconstraints/build.gradle.kts is defined const val THREETENBP = "1.3.6" } ================================================ FILE: build_android_release.sh ================================================ #!/usr/bin/env bash # Copyright 2018 Google LLC # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # https://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" MOBILE_OUT=$DIR/mobile/build/outputs export ANDROID_HOME="$(cd $DIR/../../../prebuilts/fullsdk/linux && pwd )" echo "ANDROID_HOME=$ANDROID_HOME" cd $DIR # Build GRADLE_PARAMS=" --stacktrace" $DIR/gradlew clean assemble ${GRADLE_PARAMS} BUILD_RESULT=$? # Debug cp $MOBILE_OUT/apk/debug/mobile-debug.apk $DIST_DIR # Staging cp $MOBILE_OUT/apk/staging/mobile-staging.apk $DIST_DIR # Release cp $MOBILE_OUT/apk/release/mobile-release-unsigned.apk $DIST_DIR/mobile-release.apk cp $MOBILE_OUT/mapping/release/mapping.txt $DIST_DIR/mobile-release-apk-mapping.txt # Build App Bundles # Don't clean here, otherwise all apks are gone. $DIR/gradlew bundle ${GRADLE_PARAMS} # Debug cp $MOBILE_OUT/bundle/debug/mobile-debug.aab $DIST_DIR/mobile-debug.aab # Staging cp $MOBILE_OUT/bundle/staging/mobile-staging.aab $DIST_DIR/mobile-staging.aab # Release cp $MOBILE_OUT/bundle/release/mobile-release.aab $DIST_DIR/mobile-release.aab cp $MOBILE_OUT/mapping/release/mapping.txt $DIST_DIR/mobile-release-aab-mapping.txt BUILD_RESULT=$? exit $BUILD_RESULT ================================================ FILE: copyright.kt ================================================ /* * Copyright $YEAR Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ ================================================ FILE: depconstraints/build.gradle.kts ================================================ /* * Copyright 2020 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ plugins { id("java-platform") id("maven-publish") } val appcompat = "1.1.0" val activity = "1.2.0-rc01" val activityCompose = "1.3.0-alpha03" val appStartup = "1.1.0-beta01" val cardview = "1.0.0" val archTesting = "2.0.0" val arcore = "1.7.0" val benchmark = Versions.BENCHMARK val browser = "1.0.0" val compose = Versions.COMPOSE val composeMaterial = "1.1.0" val constraintLayout = "1.1.3" val core = "1.3.2" val coroutines = "1.6.0" val coroutinesTest = "1.6.0" val crashlytics = "17.2.2" val dataStore = "1.0.0-beta01" val drawerLayout = "1.1.0-rc01" val espresso = "3.1.1" val firebaseAnalytics = "17.4.0" val firebaseAuth = "19.3.1" val firebaseConfig = "19.1.4" val firebaseFirestore = "21.4.3" val firebaseFunctions = "19.0.2" val firebaseMessaging = "20.1.6" val firebaseUi = "4.0.0" val flexbox = "1.1.0" val fragment = "1.3.0" val glide = "4.9.0" val googlePlayServicesMapsKtx = "3.0.0" val googlePlayServicesVision = "17.0.2" val gson = "2.8.6" val hamcrest = "1.3" val hilt = Versions.HILT_AGP val junit = "4.13.2" val junitExt = "1.1.1" val lifecycle = "2.4.1" val lottie = "3.0.0" val material = "1.4.0-beta01" val mockito = "3.3.1" val mockitoKotlin = "1.5.0" val okhttp = "3.10.0" val okio = "1.14.0" val pageIndicator = "1.3.0" val playCore = "1.6.5" val profileInstaller = Versions.PROFILE_INSTALLER val room = "2.4.2" val rules = "1.1.1" val runner = "1.2.0" val slidingpanelayout = "1.2.0-alpha01" val threetenabp = "1.0.5" val timber = "5.0.1" val viewpager2 = "1.0.0" val viewModelCompose = "1.0.0-alpha02" val uiAutomator = "2.2.0" dependencies { constraints { api("${Libs.ACTIVITY_COMPOSE}:$activityCompose") api("${Libs.ACTIVITY_KTX}:$activity") api("${Libs.APPCOMPAT}:$appcompat") api("${Libs.APP_STARTUP}:$appStartup") api("${Libs.CARDVIEW}:$cardview") api("${Libs.ARCH_TESTING}:$archTesting") api("${Libs.ARCORE}:$arcore") api("${Libs.BENCHMARK}:$benchmark") api("${Libs.BENCHMARK_MACRO}:$benchmark") api("${Libs.BROWSER}:$browser") api("${Libs.COMPOSE_ANIMATION}:$compose") api("${Libs.COMPOSE_MATERIAL}:$compose") api("${Libs.COMPOSE_RUNTIME}:$compose") api("${Libs.COMPOSE_TEST}:$compose") api("${Libs.COMPOSE_THEME_ADAPTER}:$composeMaterial") api("${Libs.COMPOSE_TOOLING}:$compose") api("${Libs.CONSTRAINT_LAYOUT}:$constraintLayout") api("${Libs.CORE_KTX}:$core") api("${Libs.COROUTINES}:$coroutines") api("${Libs.COROUTINES_TEST}:$coroutinesTest") api("${Libs.CRASHLYTICS}:$crashlytics") api("${Libs.DATA_STORE_PREFERENCES}:$dataStore") api("${Libs.DRAWER_LAYOUT}:$drawerLayout") api("${Libs.ESPRESSO_CORE}:$espresso") api("${Libs.ESPRESSO_CONTRIB}:$espresso") api("${Libs.FIREBASE_AUTH}:$firebaseAuth") api("${Libs.FIREBASE_CONFIG}:$firebaseConfig") api("${Libs.FIREBASE_ANALYTICS}:$firebaseAnalytics") api("${Libs.FIREBASE_FIRESTORE}:$firebaseFirestore") api("${Libs.FIREBASE_FUNCTIONS}:$firebaseFunctions") api("${Libs.FIREBASE_MESSAGING}:$firebaseMessaging") api("${Libs.FIREBASE_UI_AUTH}:$firebaseUi") api("${Libs.FLEXBOX}:$flexbox") api("${Libs.FRAGMENT_KTX}:$fragment") api("${Libs.FRAGMENT_TEST}:$fragment") api("${Libs.GLIDE}:$glide") api("${Libs.GLIDE_COMPILER}:$glide") api("${Libs.GOOGLE_MAP_UTILS_KTX}:$googlePlayServicesMapsKtx") api("${Libs.GOOGLE_PLAY_SERVICES_MAPS_KTX}:$googlePlayServicesMapsKtx") api("${Libs.GOOGLE_PLAY_SERVICES_VISION}:$googlePlayServicesVision") api("${Libs.GSON}:$gson") api("${Libs.HAMCREST}:$hamcrest") api("${Libs.HILT_ANDROID}:$hilt") api("${Libs.HILT_COMPILER}:$hilt") api("${Libs.HILT_TESTING}:$hilt") api("${Libs.JUNIT}:$junit") api("${Libs.EXT_JUNIT}:$junitExt") api("${Libs.KOTLIN_STDLIB}:${Versions.KOTLIN}") api("${Libs.LIFECYCLE_COMPILER}:$lifecycle") api("${Libs.LIFECYCLE_LIVE_DATA_KTX}:$lifecycle") api("${Libs.LIFECYCLE_RUNTIME_KTX}:$lifecycle") api("${Libs.LIFECYCLE_VIEW_MODEL_KTX}:$lifecycle") api("${Libs.LOTTIE}:$lottie") api("${Libs.MATERIAL}:$material") api("${Libs.MDC_COMPOSE_THEME_ADAPTER}:$compose") api("${Libs.MOCKITO_CORE}:$mockito") api("${Libs.MOCKITO_KOTLIN}:$mockitoKotlin") api("${Libs.NAVIGATION_FRAGMENT_KTX}:${Versions.NAVIGATION}") api("${Libs.NAVIGATION_UI_KTX}:${Versions.NAVIGATION}") api("${Libs.PROFILE_INSTALLER}:$profileInstaller") api("${Libs.ROOM_KTX}:$room") api("${Libs.ROOM_RUNTIME}:$room") api("${Libs.ROOM_COMPILER}:$room") api("${Libs.OKHTTP}:$okhttp") api("${Libs.OKHTTP_LOGGING_INTERCEPTOR}:$okhttp") api("${Libs.OKIO}:$okio") api("${Libs.INK_PAGE_INDICATOR}:$pageIndicator") api("${Libs.RULES}:$rules") api("${Libs.RUNNER}:$runner") api("${Libs.SLIDING_PANE_LAYOUT}:$slidingpanelayout") api("${Libs.THREETENABP}:$threetenabp") api("${Libs.THREETENBP}:${Versions.THREETENBP}") api("${Libs.TIMBER}:$timber") api("${Libs.UI_AUTOMATOR}:$uiAutomator") api("${Libs.VIEWPAGER2}:$viewpager2") api("${Libs.VIEWMODEL_COMPOSE}:$viewModelCompose") } } publishing { publications { create("myPlatform") { from(components["javaPlatform"]) } } } ================================================ FILE: gradle/wrapper/gradle-wrapper.properties ================================================ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists distributionUrl=https\://services.gradle.org/distributions/gradle-7.4.2-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists ================================================ FILE: gradle.properties ================================================ # Project-wide Gradle settings. # IDE (e.g. Android Studio) users: # Gradle settings configured through the IDE *will override* # any settings specified in this file. # For more details on how to configure your build environment visit # http://www.gradle.org/docs/current/userguide/build_environment.html # Specifies the JVM arguments used for the daemon process. # The setting is particularly useful for tweaking memory settings. org.gradle.jvmargs=-Xmx2g org.gradle.caching=true # When configured, Gradle will run in incubating parallel mode. # This option should only be used with decoupled projects. More details, visit # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects # org.gradle.parallel=true # AndroidX android.useAndroidX=true android.enableJetifier=true # R8 android.enableR8.fullMode=true # IOSCHED values ## Date/Time ## conference_timezone="America/Los_Angeles" conference_day1_start="2019-05-07T07:00:00-07:00" conference_day1_end="2019-05-07T22:00:01-07:00" conference_day2_start="2019-05-08T08:00:00-07:00" conference_day2_end="2019-05-08T22:00:01-07:00" conference_day3_start="2019-05-09T08:00:00-07:00" conference_day3_end="2019-05-09T22:00:00-07:00" conference_day1_afterhours_start="2019-05-07T18:30:00-07:00" conference_day2_concert_start="2019-05-08T19:30:00-07:00" ## Wifi ## conference_wifi_offering_start="2019-05-04T07:00:00-07:00" ## Endpoints ## bootstrap_conference_data_filename="conference_data_2019.json" ## Map ## # The supported zoom level range of the map viewport. map_viewport_min_zoom=16 map_viewport_max_zoom=19.75 # Conference location map bounds map_viewport_bound_ne=37.428343, -122.074584 map_viewport_bound_sw=37.423205, -122.081757 # Initial camera configuration when the map is displayed. map_default_camera_bearing=0.0 map_default_camera_target_lat=37.425842 map_default_camera_target_lng=-122.079933 map_default_camera_zoom=16.4 map_default_camera_tilt=0 # Zoom level to use when camera is programmatically centered on a marker map_camera_focus_zoom=19f # enable incremental annotation processing kapt.incremental.apt=true ================================================ FILE: gradlew ================================================ #!/bin/sh # # Copyright © 2015-2021 the original authors. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # https://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # ############################################################################## # # Gradle start up script for POSIX generated by Gradle. # # Important for running: # # (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is # noncompliant, but you have some other compliant shell such as ksh or # bash, then to run this script, type that shell name before the whole # command line, like: # # ksh Gradle # # Busybox and similar reduced shells will NOT work, because this script # requires all of these POSIX shell features: # * functions; # * expansions «$var», «${var}», «${var:-default}», «${var+SET}», # «${var#prefix}», «${var%suffix}», and «$( cmd )»; # * compound commands having a testable exit status, especially «case»; # * various built-in commands including «command», «set», and «ulimit». # # Important for patching: # # (2) This script targets any POSIX shell, so it avoids extensions provided # by Bash, Ksh, etc; in particular arrays are avoided. # # The "traditional" practice of packing multiple parameters into a # space-separated string is a well documented source of bugs and security # problems, so this is (mostly) avoided, by progressively accumulating # options in "$@", and eventually passing that to Java. # # Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, # and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; # see the in-line comments for details. # # There are tweaks for specific operating systems such as AIX, CygWin, # Darwin, MinGW, and NonStop. # # (3) This script is generated from the Groovy template # https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt # within the Gradle project. # # You can find Gradle at https://github.com/gradle/gradle/. # ############################################################################## # Attempt to set APP_HOME # Resolve links: $0 may be a link app_path=$0 # Need this for daisy-chained symlinks. while APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path [ -h "$app_path" ] do ls=$( ls -ld "$app_path" ) link=${ls#*' -> '} case $link in #( /*) app_path=$link ;; #( *) app_path=$APP_HOME$link ;; esac done APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit APP_NAME="Gradle" APP_BASE_NAME=${0##*/} # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD=maximum warn () { echo "$*" } >&2 die () { echo echo "$*" echo exit 1 } >&2 # OS specific support (must be 'true' or 'false'). cygwin=false msys=false darwin=false nonstop=false case "$( uname )" in #( CYGWIN* ) cygwin=true ;; #( Darwin* ) darwin=true ;; #( MSYS* | MINGW* ) msys=true ;; #( NONSTOP* ) nonstop=true ;; esac CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar # Determine the Java command to use to start the JVM. if [ -n "$JAVA_HOME" ] ; then if [ -x "$JAVA_HOME/jre/sh/java" ] ; then # IBM's JDK on AIX uses strange locations for the executables JAVACMD=$JAVA_HOME/jre/sh/java else JAVACMD=$JAVA_HOME/bin/java fi if [ ! -x "$JAVACMD" ] ; then die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME Please set the JAVA_HOME variable in your environment to match the location of your Java installation." fi else JAVACMD=java which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. Please set the JAVA_HOME variable in your environment to match the location of your Java installation." fi # Increase the maximum file descriptors if we can. if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then case $MAX_FD in #( max*) MAX_FD=$( ulimit -H -n ) || warn "Could not query maximum file descriptor limit" esac case $MAX_FD in #( '' | soft) :;; #( *) ulimit -n "$MAX_FD" || warn "Could not set maximum file descriptor limit to $MAX_FD" esac fi # Collect all arguments for the java command, stacking in reverse order: # * args from the command line # * the main class name # * -classpath # * -D...appname settings # * --module-path (only if needed) # * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. # For Cygwin or MSYS, switch paths to Windows format before running java if "$cygwin" || "$msys" ; then APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) JAVACMD=$( cygpath --unix "$JAVACMD" ) # Now convert the arguments - kludge to limit ourselves to /bin/sh for arg do if case $arg in #( -*) false ;; # don't mess with options #( /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath [ -e "$t" ] ;; #( *) false ;; esac then arg=$( cygpath --path --ignore --mixed "$arg" ) fi # Roll the args list around exactly as many times as the number of # args, so each arg winds up back in the position where it started, but # possibly modified. # # NB: a `for` loop captures its iteration list before it begins, so # changing the positional parameters here affects neither the number of # iterations, nor the values presented in `arg`. shift # remove old arg set -- "$@" "$arg" # push replacement arg done fi # Collect all arguments for the java command; # * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of # shell script including quotes and variable substitutions, so put them in # double quotes to make sure that they get re-expanded; and # * put everything else in single quotes, so that it's not re-expanded. set -- \ "-Dorg.gradle.appname=$APP_BASE_NAME" \ -classpath "$CLASSPATH" \ org.gradle.wrapper.GradleWrapperMain \ "$@" # Use "xargs" to parse quoted args. # # With -n1 it outputs one arg per line, with the quotes and backslashes removed. # # In Bash we could simply go: # # readarray ARGS < <( xargs -n1 <<<"$var" ) && # set -- "${ARGS[@]}" "$@" # # but POSIX shell has neither arrays nor command substitution, so instead we # post-process each arg (as a line of input to sed) to backslash-escape any # character that might be a shell metacharacter, then use eval to reverse # that process (while maintaining the separation between arguments), and wrap # the whole thing up as a single "set" statement. # # This will of course break if any of these variables contains a newline or # an unmatched quote. # eval "set -- $( printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | xargs -n1 | sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | tr '\n' ' ' )" '"$@"' exec "$JAVACMD" "$@" ================================================ FILE: gradlew.bat ================================================ @rem @rem Copyright 2015 the original author or authors. @rem @rem Licensed under the Apache License, Version 2.0 (the "License"); @rem you may not use this file except in compliance with the License. @rem You may obtain a copy of the License at @rem @rem https://www.apache.org/licenses/LICENSE-2.0 @rem @rem Unless required by applicable law or agreed to in writing, software @rem distributed under the License is distributed on an "AS IS" BASIS, @rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. @rem See the License for the specific language governing permissions and @rem limitations under the License. @rem @if "%DEBUG%" == "" @echo off @rem ########################################################################## @rem @rem Gradle startup script for Windows @rem @rem ########################################################################## @rem Set local scope for the variables with windows NT shell if "%OS%"=="Windows_NT" setlocal set DIRNAME=%~dp0 if "%DIRNAME%" == "" set DIRNAME=. set APP_BASE_NAME=%~n0 set APP_HOME=%DIRNAME% @rem Resolve any "." and ".." in APP_HOME to make it shorter. for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" @rem Find java.exe if defined JAVA_HOME goto findJavaFromJavaHome set JAVA_EXE=java.exe %JAVA_EXE% -version >NUL 2>&1 if "%ERRORLEVEL%" == "0" goto execute echo. echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. echo. echo Please set the JAVA_HOME variable in your environment to match the echo location of your Java installation. goto fail :findJavaFromJavaHome set JAVA_HOME=%JAVA_HOME:"=% set JAVA_EXE=%JAVA_HOME%/bin/java.exe if exist "%JAVA_EXE%" goto execute echo. echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% echo. echo Please set the JAVA_HOME variable in your environment to match the echo location of your Java installation. goto fail :execute @rem Setup the command line set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar @rem Execute Gradle "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* :end @rem End local scope for the variables with windows NT shell if "%ERRORLEVEL%"=="0" goto mainEnd :fail rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of rem the _cmd.exe /c_ return code! if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 exit /b 1 :mainEnd if "%OS%"=="Windows_NT" endlocal :omega ================================================ FILE: kokoro/build.sh ================================================ #!/bin/bash # Copyright 2018 Google LLC # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # https://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # Fail on any error. set -e # Display commands to stderr. set -x GRADLE_FLAGS=() if [[ -n "$GRADLE_DEBUG" ]]; then GRADLE_FLAGS=( --debug --stacktrace ) fi # Workaround of b/123314680 # We need to update the required dependencies since the Kokoro team stopped updating the custom VM. export ANDROID_HOME=/opt/android-sdk/current echo "Installing build-tools..." echo y | ${ANDROID_HOME}/tools/bin/sdkmanager "build-tools;30.0.3" > /dev/null echo y | ${ANDROID_HOME}/tools/bin/sdkmanager --licenses # Workaround for b/148189425 # AGP requires a specific NDK version for running Gradle echo "Installing NDK that matches the current version of AGP ..." echo y | ${ANDROID_HOME}/tools/bin/sdkmanager "ndk;21.0.6113669" > /dev/null cd $KOKORO_ARTIFACTS_DIR/git/iosched # Use Java 11 (b/181627163) # This needs to be set after sdkmanager runs, as sdkmanager errors using Java 11 export JAVA_HOME=${KOKORO_GFILE_DIR} export PATH="$JAVA_HOME/bin:$PATH" $JAVA_HOME/bin/javac -version ./gradlew "${GRADLE_FLAGS[@]}" build # For Firebase Test Lab SERVICE_ACCOUNT_KEY=${KOKORO_GFILE_DIR}/events-dev-62d2e-072ce72b3067.json gcloud config set project events-dev-62d2e gcloud auth activate-service-account firebasetestlabforkokoro@events-dev-62d2e.iam.gserviceaccount.com --key-file ${SERVICE_ACCOUNT_KEY} ./gradlew mobile:assembleAndroidTest ./gradlew mobile:assembleStaging MAX_RETRY=3 run_firebase_test_lab() { ## Retry can be done by passing the --num-flaky-test-attempts to gcloud, but gcloud SDK in the ## kokoro server doesn't support it yet. set +e # To not exit on an error to retry flaky tests local counter=0 local result=1 while [ $result != 0 -a $counter -lt $MAX_RETRY ]; do ## TODO: Add os-version 29 once it's available gcloud firebase test android run \ --type instrumentation \ --app mobile/build/outputs/apk/staging/mobile-staging.apk \ --test mobile/build/outputs/apk/androidTest/staging/mobile-staging-androidTest.apk \ --device-ids hammerhead,walleye,blueline \ --os-version-ids 21,26,28 \ --locales en \ --timeout 60 result=$? ; let counter=counter+1 done return $result } run_firebase_test_lab exit $? ================================================ FILE: kokoro/continuous.cfg ================================================ # Location of the continuous bash script. build_file: "iosched/kokoro/continuous.sh" # Extra input files/directories for the build gfile_resources: "/x20/teams/iosched-android/keys" # Use Java 11 (b/181627163) # Copy a JDK 11 installation from x20 gfile_resources: "/x20/projects/java-platform/linux-amd64/jdk-11-latest" env_vars { key: "GRADLE_DEBUG" value: "" } ================================================ FILE: kokoro/continuous.sh ================================================ #!/bin/bash # Copyright 2018 Google LLC # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # https://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # Fail on any error. set -e # Display commands to stderr. set -x env | sort pwd find . git/iosched/kokoro/build.sh ================================================ FILE: kokoro/presubmit.cfg ================================================ # Location of the continuous bash script. build_file: "iosched/kokoro/presubmit.sh" # Extra input files/directories for the build gfile_resources: "/x20/teams/iosched-android/keys" # Use Java 11 (b/181627163) # Copy a JDK 11 installation from x20 gfile_resources: "/x20/projects/java-platform/linux-amd64/jdk-11-latest" ================================================ FILE: kokoro/presubmit.sh ================================================ #!/bin/bash # Copyright 2018 Google LLC # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # https://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # Fail on any error. set -e # Display commands to stderr. set -x env | sort pwd find . git/iosched/kokoro/build.sh ================================================ FILE: macrobenchmark/.gitignore ================================================ /build ================================================ FILE: macrobenchmark/build.gradle ================================================ plugins { id 'com.android.test' id 'kotlin-android' } android { compileSdkVersion Versions.COMPILE_SDK defaultConfig { minSdkVersion 23 // Macrobenchmark doesn't work on lower API targetSdkVersion Versions.TARGET_SDK testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } kotlinOptions { jvmTarget = '1.8' } buildTypes { // declare a build type to match the target app's build type benchmark { debuggable = true signingConfig = debug.signingConfig } } targetProjectPath = ":mobile" experimentalProperties["android.experimental.self-instrumenting"] = true } androidComponents { beforeVariants(selector().all()) { // enable only the release buildType, since we only want to measure // release build performance enabled = buildType == 'benchmark' } } dependencies { api platform(project(":depconstraints")) implementation Libs.BENCHMARK_MACRO implementation Libs.ESPRESSO_CORE implementation Libs.EXT_JUNIT implementation Libs.KOTLIN_STDLIB implementation Libs.TIMBER implementation Libs.UI_AUTOMATOR } ================================================ FILE: macrobenchmark/consumer-rules.pro ================================================ ================================================ FILE: macrobenchmark/proguard-rules.pro ================================================ # Add project specific ProGuard rules here. # You can control the set of applied configuration files using the # proguardFiles setting in build.gradle. # # For more details, see # http://developer.android.com/guide/developing/tools/proguard.html # If your project uses WebView with JS, uncomment the following # and specify the fully qualified class name to the JavaScript interface # class: #-keepclassmembers class fqcn.of.javascript.interface.for.webview { # public *; #} # Uncomment this to preserve the line number information for # debugging stack traces. #-keepattributes SourceFile,LineNumberTable # If you keep the line number information, uncomment this to # hide the original source file name. #-renamesourcefileattribute SourceFile ================================================ FILE: macrobenchmark/src/main/AndroidManifest.xml ================================================ ================================================ FILE: macrobenchmark/src/main/java/com/google/samples/apps/iosched/macrobenchmark/BaselineProfileGenerator.kt ================================================ /* * Copyright 2022 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.macrobenchmark import androidx.benchmark.macro.ExperimentalBaselineProfilesApi import androidx.benchmark.macro.junit4.BaselineProfileRule import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.LargeTest import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith @LargeTest @RunWith(AndroidJUnit4::class) @ExperimentalBaselineProfilesApi class BaselineProfileGenerator { @get:Rule val rule = BaselineProfileRule() @Test fun generate() { rule.collectBaselineProfile(TARGET_PACKAGE) { // This block defines the app's critical user journey. Here we are interested in // optimizing for app startup. But you can also navigate and scroll // through your most important UI. pressHome() startMainAndConfirmDialogs() scrollSchedule() } } } ================================================ FILE: macrobenchmark/src/main/java/com/google/samples/apps/iosched/macrobenchmark/BenchmarkUtils.kt ================================================ /* * Copyright 2021 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.macrobenchmark import android.content.Intent import androidx.benchmark.macro.MacrobenchmarkScope import androidx.test.uiautomator.By import androidx.test.uiautomator.BySelector import androidx.test.uiautomator.Direction import androidx.test.uiautomator.Until import timber.log.Timber const val TARGET_PACKAGE = "com.google.samples.apps.iosched" val scheduleRecyclerSelector: BySelector get() = By.res(TARGET_PACKAGE, "recyclerview_schedule") fun MacrobenchmarkScope.startMainAndWait() { // Start activity defined by an action val intent = Intent("$TARGET_PACKAGE.STARTUP_ACTIVITY") Timber.tag("Benchmark") Timber.d("Starting activity $intent") // This can be usually without the intent, but in our case we have LauncherActivity with onboarding. startActivityAndWait(intent) } fun MacrobenchmarkScope.startMainAndConfirmDialogs() { startMainAndWait() // The first time the app is run, customize schedule dialog is shown confirmDialog() // Later, it may show I/O notifications dialog // Sometimes it happens that both dialogs are shown one after another confirmDialog() } fun MacrobenchmarkScope.scrollSchedule() { // Need to wait until schedule is loaded device.wait(Until.hasObject(scheduleRecyclerSelector), 10_000) val recycler = device.findObject(scheduleRecyclerSelector) // Need to set, otherwise scrolling could trigger system gesture navigation recycler.setGestureMargin(device.displayWidth / 5) // Fling several times repeat(3) { recycler.fling(Direction.DOWN) } } fun MacrobenchmarkScope.confirmDialog() { // Check if button is appeared or return val dialogPositiveButton = device.findObject(By.res("android", "button1")) ?: return dialogPositiveButton.click() device.waitForIdle() // Need short delay, because it may be animating the dialog out Thread.sleep(1_000) } ================================================ FILE: macrobenchmark/src/main/java/com/google/samples/apps/iosched/macrobenchmark/OpenDetailBenchmarks.kt ================================================ /* * Copyright 2022 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.macrobenchmark import androidx.benchmark.macro.FrameTimingMetric import androidx.benchmark.macro.StartupMode import androidx.benchmark.macro.junit4.MacrobenchmarkRule import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.LargeTest import androidx.test.uiautomator.By import androidx.test.uiautomator.Direction import androidx.test.uiautomator.Until import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith import timber.log.Timber @LargeTest @RunWith(AndroidJUnit4::class) class OpenDetailBenchmarks { @get:Rule val benchmarkRule = MacrobenchmarkRule() @Test fun openDetail() { // need to keep track which index was selected so we can always select different one var selectedIndex = 0 benchmarkRule.measureRepeated( packageName = TARGET_PACKAGE, metrics = listOf(FrameTimingMetric()), startupMode = StartupMode.COLD, iterations = 5, setupBlock = { pressHome() startMainAndConfirmDialogs() // the children count is only visible part of the screen, // so if we have too many iterations, we must scroll the recycler to other items val recycler = device.findObject(scheduleRecyclerSelector) if (selectedIndex >= recycler.childCount) { // need to set, otherwise scrolling could trigger system gesture navigation recycler.setGestureMargin(device.displayWidth / 5) // since scroll is unreliable, we scroll surely far enough to have new items repeat(recycler.childCount) { recycler.scroll(Direction.DOWN, 1f) } // and start again at first visible item on the screen selectedIndex = 0 } } ) { val recycler = device.findObject(scheduleRecyclerSelector) // click on item which navigates to event detail val item = recycler.children[selectedIndex] ?: error("Session on index $selectedIndex not found") val itemTitleView = item.findObject(By.res(TARGET_PACKAGE, "title")) Timber.tag("Benchmark") Timber.d("Opening detail(${itemTitleView?.text}) at index $selectedIndex") item.click() // wait until detail title is shown device.wait(Until.hasObject(By.res(TARGET_PACKAGE, "session_detail_title")), 10_000) // next time select different item selectedIndex++ } } } ================================================ FILE: macrobenchmark/src/main/java/com/google/samples/apps/iosched/macrobenchmark/ScheduleBenchmarks.kt ================================================ /* * Copyright 2022 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.macrobenchmark import androidx.benchmark.macro.FrameTimingMetric import androidx.benchmark.macro.StartupMode import androidx.benchmark.macro.junit4.MacrobenchmarkRule import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.LargeTest import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith @LargeTest @RunWith(AndroidJUnit4::class) class ScheduleBenchmarks { @get:Rule val benchmarkRule = MacrobenchmarkRule() @Test fun scrollSchedule() { benchmarkRule.measureRepeated( metrics = listOf(FrameTimingMetric()), packageName = TARGET_PACKAGE, iterations = 5, startupMode = StartupMode.COLD, setupBlock = { pressHome() startMainAndConfirmDialogs() } ) { scrollSchedule() } } } ================================================ FILE: macrobenchmark/src/main/java/com/google/samples/apps/iosched/macrobenchmark/StartupBenchmarks.kt ================================================ /* * Copyright 2022 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.macrobenchmark import androidx.benchmark.macro.CompilationMode import androidx.benchmark.macro.StartupMode import androidx.benchmark.macro.StartupTimingMetric import androidx.benchmark.macro.junit4.MacrobenchmarkRule import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.LargeTest import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith @LargeTest @RunWith(AndroidJUnit4::class) class StartupBenchmarks { @get:Rule val benchmarkRule = MacrobenchmarkRule() @Test fun startupCompilationNone() = startup(CompilationMode.None()) @Test fun startupCompilationPartial() = startup(CompilationMode.Partial()) @Test fun startupCompilationFull() = startup(CompilationMode.Full()) private fun startup(compilationMode: CompilationMode) = benchmarkRule.measureRepeated( packageName = TARGET_PACKAGE, compilationMode = compilationMode, startupMode = StartupMode.COLD, iterations = 5, metrics = listOf(StartupTimingMetric()), setupBlock = { pressHome() } ) { startMainAndWait() } } ================================================ FILE: mobile/build.gradle.kts ================================================ /* * Copyright 2022 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ plugins { id("com.android.application") kotlin("android") kotlin("kapt") id("androidx.navigation.safeargs.kotlin") id("com.google.firebase.crashlytics") id("dagger.hilt.android.plugin") } android { compileSdk = Versions.COMPILE_SDK defaultConfig { applicationId = "com.google.samples.apps.iosched" minSdk = Versions.MIN_SDK targetSdk = Versions.TARGET_SDK versionCode = Versions.versionCodeMobile versionName = Versions.versionName testInstrumentationRunner = "com.google.samples.apps.iosched.tests.CustomTestRunner" buildConfigField( "com.google.android.gms.maps.model.LatLng", "MAP_VIEWPORT_BOUND_NE", "new com.google.android.gms.maps.model.LatLng(${project.properties["map_viewport_bound_ne"]})" ) buildConfigField( "com.google.android.gms.maps.model.LatLng", "MAP_VIEWPORT_BOUND_SW", "new com.google.android.gms.maps.model.LatLng(${project.properties["map_viewport_bound_sw"]})" ) buildConfigField("float", "MAP_CAMERA_FOCUS_ZOOM", project.properties["map_camera_focus_zoom"] as String) resValue("dimen", "map_camera_bearing", project.properties["map_default_camera_bearing"] as String) resValue("dimen", "map_camera_target_lat", project.properties["map_default_camera_target_lat"] as String) resValue("dimen", "map_camera_target_lng", project.properties["map_default_camera_target_lng"] as String) resValue("dimen", "map_camera_tilt", project.properties["map_default_camera_tilt"] as String) resValue("dimen", "map_camera_zoom", project.properties["map_default_camera_zoom"] as String) resValue("dimen", "map_viewport_min_zoom", project.properties["map_viewport_min_zoom"] as String) resValue("dimen", "map_viewport_max_zoom", project.properties["map_viewport_max_zoom"] as String) manifestPlaceholders["crashlyticsEnabled"] = true vectorDrawables.useSupportLibrary = true javaCompileOptions { annotationProcessorOptions { arguments["room.incremental"] = "true" } } } buildTypes { getByName("release") { isMinifyEnabled = true // TODO: b/120517460 shrinkResource can't be used with dynamic-feature at this moment. // Need to ensure the app size has not increased manifestPlaceholders["crashlyticsEnabled"] = true proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro") resValue( "string", "google_maps_key", "AIzaSyD5jqwKMm1SeoYsW25vxCXfTlhDBeZ4H5c" ) buildConfigField("String", "MAP_TILE_URL_BASE", "\"https://storage.googleapis.com/io2019-festivus-prod/images/maptiles\"") } getByName("debug") { versionNameSuffix = "-debug" manifestPlaceholders["crashlyticsEnabled"] = false resValue( "string", "google_maps_key", "AIzaSyAhJx57ikQH9rYc8IT8W3d2As5cGHMBvuo" ) buildConfigField("String", "MAP_TILE_URL_BASE", "\"https://storage.googleapis.com/io2019-festivus/images/maptiles\"") } maybeCreate("staging") getByName("staging") { initWith(getByName("debug")) versionNameSuffix = "-staging" // Specifies a sorted list of fallback build types that the // plugin should try to use when a dependency does not include a // "staging" build type. // Used with :test-shared, which doesn't have a staging variant. matchingFallbacks += listOf("debug") } maybeCreate("benchmark") getByName("benchmark") { initWith(getByName("staging")) versionNameSuffix = "-benchmark" isMinifyEnabled = true isDebuggable = false proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro", "proguard-rules-benchmark.pro") // Specifies a sorted list of fallback build types that the // plugin should try to use when a dependency does not include a // "benchmark" build type. // Used with :test-shared, which doesn't have a benchmark variant. matchingFallbacks += listOf("staging", "debug") } } buildFeatures { viewBinding = true dataBinding = true compose = true } composeOptions { kotlinCompilerExtensionVersion = Versions.COMPOSE } signingConfigs { // We need to sign debug builds with a debug key to make firebase auth happy getByName("debug") { storeFile = file("../debug.keystore") keyAlias = "androiddebugkey" keyPassword = "android" storePassword = "android" } } // debug and release variants share the same source dir sourceSets { getByName("debug") { java.srcDir("src/debugRelease/java") } getByName("release") { java.srcDir("src/debugRelease/java") } getByName("benchmark") { java.srcDir("src/staging/java") res.srcDir("src/staging/res") } } lint { // Eliminates UnusedResources false positives for resources used in DataBinding layouts checkGeneratedSources = true // Running lint over the debug variant is enough checkReleaseBuilds = false // See lint.xml for rules configuration // TODO: Remove when upgrading lifecycle from `2.4.0-alpha01`. // Fix: https://android-review.googlesource.com/c/platform/frameworks/support/+/1697465 // Bug: https://issuetracker.google.com/184830263 disable += "NullSafeMutableLiveData" } testBuildType = "staging" // Required for AR because it includes a library built with Java 8 compileOptions { sourceCompatibility = JavaVersion.VERSION_1_8 targetCompatibility = JavaVersion.VERSION_1_8 } // To avoid the compile error: "Cannot inline bytecode built with JVM target 1.8 // into bytecode that is being built with JVM target 1.6" kotlinOptions { val options = this as org.jetbrains.kotlin.gradle.dsl.KotlinJvmOptions options.jvmTarget = "1.8" } packagingOptions { resources.excludes += "META-INF/AL2.0" resources.excludes += "META-INF/LGPL2.1" } } kapt { arguments { arg("dagger.hilt.shareTestComponents", "true") } } dependencies { api(platform(project(":depconstraints"))) kapt(platform(project(":depconstraints"))) androidTestApi(platform(project(":depconstraints"))) implementation(project(":shared")) implementation(project(":ar")) testImplementation(project(":test-shared")) testImplementation(project(":androidTest-shared")) implementation(fileTree(mapOf("dir" to "libs", "include" to listOf("*.jar")))) implementation(Libs.CORE_KTX) implementation(Libs.APP_STARTUP) implementation(Libs.PROFILE_INSTALLER) // UI implementation(Libs.ACTIVITY_KTX) implementation(Libs.APPCOMPAT) implementation(Libs.FRAGMENT_KTX) implementation(Libs.CARDVIEW) implementation(Libs.BROWSER) implementation(Libs.CONSTRAINT_LAYOUT) implementation(Libs.DRAWER_LAYOUT) implementation(Libs.MATERIAL) implementation(Libs.FLEXBOX) implementation(Libs.LOTTIE) implementation(Libs.INK_PAGE_INDICATOR) implementation(Libs.SLIDING_PANE_LAYOUT) // Architecture Components implementation(Libs.LIFECYCLE_LIVE_DATA_KTX) implementation(Libs.LIFECYCLE_RUNTIME_KTX) kapt(Libs.LIFECYCLE_COMPILER) testImplementation(Libs.ARCH_TESTING) implementation(Libs.NAVIGATION_FRAGMENT_KTX) implementation(Libs.NAVIGATION_UI_KTX) implementation(Libs.ROOM_KTX) implementation(Libs.ROOM_RUNTIME) kapt(Libs.ROOM_COMPILER) testImplementation(Libs.ROOM_KTX) testImplementation(Libs.ROOM_RUNTIME) // Compose implementation(Libs.ACTIVITY_COMPOSE) implementation(Libs.COMPOSE_ANIMATION) implementation(Libs.COMPOSE_MATERIAL) implementation(Libs.COMPOSE_RUNTIME) implementation(Libs.COMPOSE_THEME_ADAPTER) implementation(Libs.COMPOSE_TOOLING) implementation(Libs.VIEWMODEL_COMPOSE) implementation(Libs.MDC_COMPOSE_THEME_ADAPTER) androidTestImplementation(Libs.COMPOSE_TEST) // Dagger Hilt implementation(Libs.HILT_ANDROID) androidTestImplementation(Libs.HILT_TESTING) kapt(Libs.HILT_COMPILER) kaptAndroidTest(Libs.HILT_COMPILER) // DataStore implementation(Libs.DATA_STORE_PREFERENCES) androidTestImplementation(Libs.DATA_STORE_PREFERENCES) // Glide implementation(Libs.GLIDE) kapt(Libs.GLIDE_COMPILER) // Fabric and Firebase implementation(Libs.FIREBASE_UI_AUTH) implementation(Libs.CRASHLYTICS) // Date and time API for Java. implementation(Libs.THREETENABP) testImplementation(Libs.THREETENBP) // Kotlin implementation(Libs.KOTLIN_STDLIB) // Instrumentation tests androidTestImplementation(Libs.ESPRESSO_CORE) androidTestImplementation(Libs.ESPRESSO_CONTRIB) androidTestImplementation(Libs.EXT_JUNIT) androidTestImplementation(Libs.RUNNER) androidTestImplementation(Libs.RULES) androidTestImplementation(Libs.FRAGMENT_TEST) debugImplementation(Libs.FRAGMENT_TEST) add("stagingImplementation", Libs.FRAGMENT_TEST) // Local unit tests testImplementation(Libs.JUNIT) testImplementation(Libs.MOCKITO_CORE) testImplementation(Libs.MOCKITO_KOTLIN) testImplementation(Libs.HAMCREST) // Solve conflicts with gson. DataBinding is using an old version. implementation(Libs.GSON) implementation(Libs.ARCORE) } apply(plugin = "com.google.gms.google-services") ================================================ FILE: mobile/google-services.json ================================================ { "project_info": { "project_number": "447780894619", "firebase_url": "https://events-dev-62d2e.firebaseio.com", "project_id": "events-dev-62d2e", "storage_bucket": "events-dev-62d2e.appspot.com" }, "client": [ { "client_info": { "mobilesdk_app_id": "1:447780894619:android:66c485c6a5187053", "android_client_info": { "package_name": "com.google.samples.apps.iosched" } }, "oauth_client": [ { "client_id": "447780894619-an6s48nvj18f25v4nc5te03q2c4g9dqf.apps.googleusercontent.com", "client_type": 3 }, { "client_id": "447780894619-u3o7j05aqv0u0mb0nmu7btseg1csrrlg.apps.googleusercontent.com", "client_type": 1, "android_info": { "package_name": "com.google.samples.apps.iosched", "certificate_hash": "e499e9081b4ddf63788f4dfb4e7018c54f93188b" } }, { "client_id": "447780894619-tbe57ou9oflnoic5scbc8mj8tnnj9o2r.apps.googleusercontent.com", "client_type": 3 } ], "api_key": [ { "current_key": "AIzaSyC_LbkKaCrAaBJSBp7DbDZgwLLR3BYUJV0" } ], "services": { "analytics_service": { "status": 1 }, "appinvite_service": { "status": 2, "other_platform_oauth_client": [ { "client_id": "447780894619-an6s48nvj18f25v4nc5te03q2c4g9dqf.apps.googleusercontent.com", "client_type": 3 }, { "client_id": "447780894619-c9ovo169ue58khaq7pmj9pvvkbmjt6l2.apps.googleusercontent.com", "client_type": 2, "ios_info": { "bundle_id": "com.google.iosched.dev" } } ] }, "ads_service": { "status": 2 } } } ], "configuration_version": "1" } ================================================ FILE: mobile/lint.xml ================================================ ================================================ FILE: mobile/proguard-rules-benchmark.pro ================================================ # Copyright 2018 Google LLC # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # https://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # Obsfuscation must be disabled for the build variant that generates Baseline Profile, otherwise # wrong symbols would be generated. The generated Baseline Profile will be properly applied if generated # without obfuscation and your app is being obfuscated. -dontobfuscate ================================================ FILE: mobile/proguard-rules.pro ================================================ # Copyright 2018 Google LLC # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # https://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # Glide -keep public class * implements com.bumptech.glide.module.GlideModule -keep public class * extends com.bumptech.glide.module.AppGlideModule -keep public enum com.bumptech.glide.load.ImageHeaderParser$** { **[] $VALUES; public *; } -keepattributes *Annotation* -keepattributes SourceFile,LineNumberTable -keep public class * extends java.lang.Exception -keep class com.crashlytics.** { *; } -dontwarn com.crashlytics.** # https://github.com/firebase/FirebaseUI-Android/issues/1429 -keep class com.firebase.ui.auth.** { * ; } # Firebase Functions -keep class org.json.** { *; } ================================================ FILE: mobile/sampledata/codelabs.json ================================================ { "comment": "Sample codelab data for use with tools:... attributes in layouts", "codelabs": [ { "title": "Accelerated Mobile Pages Foundations", "description": "In this codelab, you'll learn how to build Accelerated Mobile Pages, or AMP for short. You will implement a simple news article web page that conforms to the AMP specifications while incorporating several typical web features commonly used on mobile news sites.", "duration": "39 min" }, { "title": "Add Voice Interactions to Your App", "description": "In this codelab, you'll learn how to add voice interactions to your app with the Voice Interaction API. The Voice Interaction API allows users of your app to confirm actions and select from a list of options using only their voice.", "duration": "19 min" }, { "title": "Android Data Binding codelab", "description": "In this codelab you'll learn how to set up Data Binding, use layout expressions, work with observable objects and create custom Binding Adapters to reduce boilerplate to a minimum.", "duration": "45 min" }, { "title": "Android Persistence codelab", "description": "In this codelab, you begin with a sample app and add code through a series of steps, integrating the various persistence components as you progress.", "duration": "50 min" }, { "title": "Android & TensorFlow: Artistic Style Transfer", "description": "This codelab will walk you through the process of using an artistic style transfer neural network in an Android app in just 9 lines of code. You can also use the techniques outlined in this codelab to implement any TensorFlow network you have already trained.", "duration": "22 min" }, { "title": "Building Beautiful UIs with Flutter", "description": "Learn how to write a Flutter app that looks natural on both iOS and Android; how to debug your Flutter app; and how to run your Flutter app on a simulator/emulator and on a device.", "duration": "90 min" }, { "title": "Build a Fast Checkout Experience on the Web with Google Pay", "description": "This codelab walks you through integrating Google Pay into an existing site, including determining whether a user is able to pay using a payment method supported by Google Pay, the placement and design of the payment button and the execution of the transaction", "duration": "30 min:" }, { "title": "Build Actions for the Google Assistant (Level 1)", "description": "In this codelab, you'll build a simple conversational Action. This codelab covers beginner-level concepts for developing with Actions on Google. You do not need to have any prior experience with the platform to follow this codelab.", "duration": "50 min" }, { "title": "Cloud Functions for Firebase", "description": "In this codelab, you'll learn how to use the Firebase SDK for Google Cloud Functions to improve a Chat Web app and how to use Cloud Functions to send notifications to users of the Chat app.", "duration": "62 min" }, { "title": "Enable Deep Linking to your App", "description": "In this codelab, you'll learn how to handle deep links in a sample Android app. You'll be able to play with the sample app to simulate deep linking from search results on your own Android device.", "duration": "14 min" } ] } ================================================ FILE: mobile/sampledata/day_indicator.json ================================================ { "comment": "Sample day indicators for use with tools:... attributes in layouts", "indicators": [ { "label": "May 7", "checked": false }, { "label": "May 8", "checked": true }, { "label": "May 9", "checked": false } ] } ================================================ FILE: mobile/sampledata/map_variants.json ================================================ { "comment": "Sample map variant data for use with tools:... attributes in layouts", "variants": [ { "title": "Daytime", "checked": true }, { "title": "After dark", "checked": false }, { "title": "Concert", "checked": false } ] } ================================================ FILE: mobile/sampledata/tags.json ================================================ { "comment": "Sample tag data for use with tools:... attributes in layouts, primarily list items", "tags": [ { "name": "Ads", "color": "#B0BEC5", "checked": false }, { "name": "Android", "color": "#AED581", "checked": true }, { "name": "Assistant", "color": "#1ce8b5", "checked": false }, { "name": "Cloud", "color": "#80CBC4", "checked": false }, { "name": "Design", "color": "#F8BBD0", "checked": false }, { "name": "Firebase", "color": "#FFD54F", "checked": false }, { "name": "IoT", "color": "#BCAAA4", "checked": false }, { "name": "Location & Maps", "color": "#EF9A9A", "checked": false }, { "name": "Look how long the name of this track is!", "color": "#33b5e5", "checked": false }, { "name": "Machine Learning & AI", "color": "#bcc8fb", "checked": false }, { "name": "Misc", "color": "#C5C9E9", "checked": false }, { "name": "Mobile Web", "color": "#FFF176", "checked": false }, { "name": "Search", "color": "#90CAF9", "checked": false }, { "name": "VR", "color": "#FF8A65", "checked": false } ] } ================================================ FILE: mobile/src/androidTest/AndroidManifest.xml ================================================ ================================================ FILE: mobile/src/androidTest/java/com/google/samples/apps/iosched/tests/CustomTestRunner.kt ================================================ /* * Copyright 2019 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.tests import android.app.Application import android.content.Context import androidx.test.runner.AndroidJUnitRunner import dagger.hilt.android.testing.CustomTestApplication /** * A custom [AndroidJUnitRunner] used to replace the application used in tests. Note that Hilt * generates a [CustomTestRunner_Application] based on the the [MainTestApplication] defined in * the [CustomBaseTestApplication] annotation. */ @CustomTestApplication(MainTestApplication::class) class CustomTestRunner : AndroidJUnitRunner() { override fun newApplication(cl: ClassLoader?, name: String?, context: Context?): Application { return super.newApplication(cl, CustomTestRunner_Application::class.java.name, context) } } ================================================ FILE: mobile/src/androidTest/java/com/google/samples/apps/iosched/tests/FixedTimeRule.kt ================================================ /* * Copyright 2018 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.tests import com.google.samples.apps.iosched.shared.time.DefaultTimeProvider import com.google.samples.apps.iosched.shared.time.TimeProvider import org.junit.rules.TestWatcher import org.junit.runner.Description import org.threeten.bp.Instant /** * Rule to be used in tests that sets the clocked used by DefaultTimeProvider. */ class FixedTimeRule( private val fixedTime: FixedTimeProvider = FixedTimeProvider(1_000_000) ) : TestWatcher() { override fun starting(description: Description?) { super.starting(description) DefaultTimeProvider.setDelegate(fixedTime) } override fun finished(description: Description?) { super.finished(description) DefaultTimeProvider.setDelegate(null) } } /** * Fix the TimeProvider to a fixed time */ class FixedTimeProvider(private var instant: Instant) : TimeProvider { constructor(timeInMilis: Long) : this(Instant.ofEpochMilli(timeInMilis)) override fun now(): Instant { return instant } } ================================================ FILE: mobile/src/androidTest/java/com/google/samples/apps/iosched/tests/MainTestApplication.kt ================================================ /* * Copyright 2019 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.tests import android.app.Application import com.jakewharton.threetenabp.AndroidThreeTen import timber.log.Timber /** * Used as a base application for Hilt to run instrumented tests through the [CustomTestRunner]. */ open class MainTestApplication : Application() { override fun onCreate() { // ThreeTenBP for times and dates, called before super to be available for objects AndroidThreeTen.init(this) Timber.plant(Timber.DebugTree()) super.onCreate() } } ================================================ FILE: mobile/src/androidTest/java/com/google/samples/apps/iosched/tests/SetPreferencesRule.kt ================================================ /* * Copyright 2018 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.tests import androidx.test.core.app.ApplicationProvider import com.google.samples.apps.iosched.shared.data.prefs.PreferenceStorage import com.google.samples.apps.iosched.shared.di.ApplicationScope import dagger.hilt.EntryPoint import dagger.hilt.InstallIn import dagger.hilt.android.EntryPointAccessors import dagger.hilt.components.SingletonComponent import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.cancel import kotlinx.coroutines.test.runTest import org.junit.rules.TestWatcher import org.junit.runner.Description /** * Rule to be used in tests that sets the preferences needed for avoiding onboarding flows, * resetting filters, etc. */ class SetPreferencesRule : TestWatcher() { @InstallIn(SingletonComponent::class) @EntryPoint interface SetPreferencesRuleEntryPoint { fun preferenceStorage(): PreferenceStorage @ApplicationScope fun applicationScope(): CoroutineScope } override fun starting(description: Description?) { super.starting(description) EntryPointAccessors.fromApplication( ApplicationProvider.getApplicationContext(), SetPreferencesRuleEntryPoint::class.java ).preferenceStorage().apply { runTest { completeOnboarding(true) showScheduleUiHints(true) preferConferenceTimeZone(true) selectFilters("") sendUsageStatistics(false) showNotificationsPreference(true) } } } override fun finished(description: Description) { // At the end of every test, cancel the application scope // So DataStore is closed EntryPointAccessors.fromApplication( ApplicationProvider.getApplicationContext(), SetPreferencesRuleEntryPoint::class.java ).applicationScope().cancel() super.finished(description) } } ================================================ FILE: mobile/src/androidTest/java/com/google/samples/apps/iosched/tests/di/HiltExt.kt ================================================ /* * Copyright 2021 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.tests.di import android.content.ComponentName import android.content.Intent import android.os.Bundle import androidx.annotation.StyleRes import androidx.core.util.Preconditions import androidx.fragment.app.Fragment import androidx.test.core.app.ActivityScenario import androidx.test.core.app.ApplicationProvider import com.google.samples.apps.iosched.R import com.google.samples.apps.iosched.test.HiltTestActivity /** * launchFragmentInContainer from the androidx.fragment:fragment-testing library * is NOT possible to use right now as it uses a hardcoded Activity under the hood * (i.e. [EmptyFragmentActivity]) which is not annotated with @AndroidEntryPoint. * * As a workaround, use this function that is equivalent. It requires you to add * [HiltTestActivity] in the debug folder and include it in the debug AndroidManifest.xml file * as can be found in this project. */ inline fun launchFragmentInHiltContainer( fragmentArgs: Bundle? = null, @StyleRes themeResId: Int = R.style.FragmentScenarioEmptyFragmentActivityTheme, crossinline action: Fragment.() -> Unit = {} ) { val startActivityIntent = Intent.makeMainActivity( ComponentName( ApplicationProvider.getApplicationContext(), HiltTestActivity::class.java ) ).putExtra( "androidx.fragment.app.testing.FragmentScenario" + ".EmptyFragmentActivity.THEME_EXTRAS_BUNDLE_KEY", themeResId ) ActivityScenario.launch(startActivityIntent).onActivity { activity -> val fragment: Fragment = activity.supportFragmentManager.fragmentFactory.instantiate( Preconditions.checkNotNull(T::class.java.classLoader), T::class.java.name ) fragment.arguments = fragmentArgs activity.supportFragmentManager .beginTransaction() .add(android.R.id.content, fragment, "") .commitNow() fragment.action() } } ================================================ FILE: mobile/src/androidTest/java/com/google/samples/apps/iosched/tests/di/TestCoroutinesModule.kt ================================================ /* * Copyright 2019 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.tests.di import android.os.AsyncTask import com.google.samples.apps.iosched.di.CoroutinesModule import com.google.samples.apps.iosched.shared.di.DefaultDispatcher import com.google.samples.apps.iosched.shared.di.IoDispatcher import com.google.samples.apps.iosched.shared.di.MainDispatcher import com.google.samples.apps.iosched.shared.di.MainImmediateDispatcher import dagger.Module import dagger.Provides import dagger.hilt.components.SingletonComponent import dagger.hilt.testing.TestInstallIn import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.asCoroutineDispatcher @TestInstallIn( components = [SingletonComponent::class], replaces = [CoroutinesModule::class] ) @Module object TestCoroutinesModule { @DefaultDispatcher @Provides fun providesDefaultDispatcher(): CoroutineDispatcher = AsyncTask.THREAD_POOL_EXECUTOR.asCoroutineDispatcher() @IoDispatcher @Provides fun providesIoDispatcher(): CoroutineDispatcher = AsyncTask.THREAD_POOL_EXECUTOR.asCoroutineDispatcher() @MainDispatcher @Provides fun providesMainDispatcher(): CoroutineDispatcher = Dispatchers.Main @MainImmediateDispatcher @Provides fun providesMainImmediateDispatcher(): CoroutineDispatcher = Dispatchers.Main.immediate } ================================================ FILE: mobile/src/androidTest/java/com/google/samples/apps/iosched/tests/di/TestPreferencesStorageModule.kt ================================================ /* * Copyright 2021 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.tests.di import android.content.Context import androidx.datastore.core.DataStore import androidx.datastore.preferences.SharedPreferencesMigration import androidx.datastore.preferences.core.PreferenceDataStoreFactory import androidx.datastore.preferences.core.Preferences import androidx.datastore.preferences.preferencesDataStoreFile import com.google.samples.apps.iosched.shared.data.prefs.DataStorePreferenceStorage.Companion.PREFS_NAME import com.google.samples.apps.iosched.di.PreferencesStorageModule import com.google.samples.apps.iosched.shared.data.prefs.DataStorePreferenceStorage import com.google.samples.apps.iosched.shared.data.prefs.PreferenceStorage import com.google.samples.apps.iosched.shared.di.ApplicationScope import dagger.Module import dagger.Provides import dagger.hilt.android.qualifiers.ApplicationContext import dagger.hilt.components.SingletonComponent import dagger.hilt.testing.TestInstallIn import kotlinx.coroutines.CoroutineScope import javax.inject.Singleton @TestInstallIn( components = [SingletonComponent::class], replaces = [PreferencesStorageModule::class] ) @Module object TestPreferencesStorageModule { @Singleton @Provides fun providePreferenceStorage(dataStore: DataStore): PreferenceStorage = DataStorePreferenceStorage(dataStore) @Singleton @Provides fun provideDataStore( @ApplicationContext context: Context, @ApplicationScope applicationScope: CoroutineScope ): DataStore { // Using PreferenceDataStoreFactory so we can set our own application scope // that we can control and cancel in UI tests val datastore = PreferenceDataStoreFactory.create( migrations = listOf(SharedPreferencesMigration(context, PREFS_NAME)), scope = applicationScope ) { context.preferencesDataStoreFile(PREFS_NAME) } return datastore } } ================================================ FILE: mobile/src/androidTest/java/com/google/samples/apps/iosched/tests/prefs/DataStorePreferenceStorageTest.kt ================================================ /* * Copyright 2021 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.tests.prefs import android.content.Context import androidx.datastore.preferences.preferencesDataStore import androidx.test.core.app.ApplicationProvider import com.google.samples.apps.iosched.shared.data.prefs.DataStorePreferenceStorage import com.google.samples.apps.iosched.shared.data.prefs.PreferenceStorage import kotlinx.coroutines.flow.first import kotlinx.coroutines.test.runTest import org.junit.Assert.assertEquals import org.junit.Assert.assertTrue import org.junit.Before import org.junit.Test val Context.dataStore by preferencesDataStore(name = "test") class DataStorePreferenceStorageTest { private lateinit var context: Context private lateinit var preferenceStorage: PreferenceStorage @Before fun init() { context = ApplicationProvider.getApplicationContext() preferenceStorage = DataStorePreferenceStorage(context.dataStore) } @Test fun completeOnboarding() = runTest { preferenceStorage.completeOnboarding(true) val result = preferenceStorage.onboardingCompleted.first() assertTrue(result) } @Test fun showScheduleUiHints() = runTest { preferenceStorage.showScheduleUiHints(true) val result = preferenceStorage.areScheduleUiHintsShown() assertTrue(result) } @Test fun showNotificationsPreference() = runTest { preferenceStorage.showNotificationsPreference(true) val result = preferenceStorage.notificationsPreferenceShown.first() assertTrue(result) } @Test fun preferToReceiveNotifications() = runTest { preferenceStorage.preferToReceiveNotifications(true) val result = preferenceStorage.preferToReceiveNotifications.first() assertTrue(result) } @Test fun optInMyLocation() = runTest { preferenceStorage.optInMyLocation(true) val result = preferenceStorage.myLocationOptedIn.first() assertTrue(result) } @Test fun stopSnackbar() = runTest { preferenceStorage.stopSnackbar(true) val result = preferenceStorage.isSnackbarStopped() assertTrue(result) } @Test fun sendUsageStatistics() = runTest { preferenceStorage.sendUsageStatistics(true) val result = preferenceStorage.sendUsageStatistics.first() assertTrue(result) } @Test fun preferConferenceTimeZone() = runTest { preferenceStorage.preferConferenceTimeZone(true) val result = preferenceStorage.preferConferenceTimeZone.first() assertTrue(result) } @Test fun selectFilters() = runTest { val filters = "filter1, filter2" preferenceStorage.selectFilters(filters) val result = preferenceStorage.selectedFilters.first() assertEquals(filters, result) } @Test fun selectTheme() = runTest { val theme = "theme" preferenceStorage.selectTheme(theme) val result = preferenceStorage.selectedTheme.first() assertEquals(theme, result) } @Test fun showCodelabsInfo() = runTest { preferenceStorage.showCodelabsInfo(true) val result = preferenceStorage.codelabsInfoShown.first() assertTrue(result) } } ================================================ FILE: mobile/src/androidTest/java/com/google/samples/apps/iosched/tests/ui/AgendaTest.kt ================================================ /* * Copyright 2019 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.tests.ui import android.widget.TextView import androidx.test.espresso.Espresso.onView import androidx.test.espresso.assertion.ViewAssertions.matches import androidx.test.espresso.matcher.ViewMatchers.isDisplayed import androidx.test.espresso.matcher.ViewMatchers.withId import androidx.test.espresso.matcher.ViewMatchers.withParent import androidx.test.espresso.matcher.ViewMatchers.withText import androidx.test.ext.junit.runners.AndroidJUnit4 import com.google.samples.apps.iosched.R import com.google.samples.apps.iosched.tests.SetPreferencesRule import dagger.hilt.android.testing.HiltAndroidRule import dagger.hilt.android.testing.HiltAndroidTest import org.hamcrest.CoreMatchers.allOf import org.hamcrest.CoreMatchers.instanceOf import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith @HiltAndroidTest @RunWith(AndroidJUnit4::class) class AgendaTest { @get:Rule(order = 0) var hiltRule = HiltAndroidRule(this) // Sets the preferences so no welcome screens are shown @get:Rule(order = 1) var preferencesRule = SetPreferencesRule() @get:Rule(order = 2) var activityRule = MainActivityTestRule(R.id.navigation_agenda) @Test fun agenda_basicViewsDisplayed() { // Title onView(allOf(instanceOf(TextView::class.java), withParent(withId(R.id.toolbar)))) .check(matches(withText(R.string.agenda))) // One of the blocks onView(withText("Breakfast")).check(matches(isDisplayed())) } } ================================================ FILE: mobile/src/androidTest/java/com/google/samples/apps/iosched/tests/ui/CodelabTest.kt ================================================ /* * Copyright 2019 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.tests.ui import android.widget.TextView import androidx.test.espresso.Espresso.onView import androidx.test.espresso.assertion.ViewAssertions.matches import androidx.test.espresso.matcher.ViewMatchers.isDisplayed import androidx.test.espresso.matcher.ViewMatchers.withId import androidx.test.espresso.matcher.ViewMatchers.withParent import androidx.test.espresso.matcher.ViewMatchers.withText import androidx.test.ext.junit.runners.AndroidJUnit4 import com.google.samples.apps.iosched.R import com.google.samples.apps.iosched.shared.data.FakeConferenceDataSource import com.google.samples.apps.iosched.tests.SetPreferencesRule import dagger.hilt.android.testing.HiltAndroidRule import dagger.hilt.android.testing.HiltAndroidTest import org.hamcrest.CoreMatchers.allOf import org.hamcrest.CoreMatchers.instanceOf import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith @HiltAndroidTest @RunWith(AndroidJUnit4::class) class CodelabTest { @get:Rule(order = 0) var hiltRule = HiltAndroidRule(this) // Sets the preferences so no welcome screens are shown @get:Rule(order = 1) var preferencesRule = SetPreferencesRule() @get:Rule(order = 2) var activityRule = MainActivityTestRule(R.id.navigation_codelabs) @Test fun codelab_basicViewsDisplayed() { // Title onView(allOf(instanceOf(TextView::class.java), withParent(withId(R.id.toolbar)))) .check(matches(withText(R.string.event_codelabs_title))) // One of the codelabs Thread.sleep(400) // TODO: RecyclerView is async so it makes the test fail onView(withText(FakeConferenceDataSource.FAKE_CODELAB_TITLE)).check(matches(isDisplayed())) } } ================================================ FILE: mobile/src/androidTest/java/com/google/samples/apps/iosched/tests/ui/HomeTest.kt ================================================ /* * Copyright 2019 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.tests.ui import android.widget.TextView import androidx.recyclerview.widget.RecyclerView.ViewHolder import androidx.test.espresso.Espresso.onView import androidx.test.espresso.action.ViewActions.scrollTo import androidx.test.espresso.assertion.ViewAssertions.matches import androidx.test.espresso.contrib.RecyclerViewActions.actionOnItemAtPosition import androidx.test.espresso.matcher.ViewMatchers.isDisplayed import androidx.test.espresso.matcher.ViewMatchers.withId import androidx.test.espresso.matcher.ViewMatchers.withParent import androidx.test.espresso.matcher.ViewMatchers.withText import androidx.test.ext.junit.runners.AndroidJUnit4 import com.google.samples.apps.iosched.R import com.google.samples.apps.iosched.tests.SetPreferencesRule import dagger.hilt.android.testing.HiltAndroidRule import dagger.hilt.android.testing.HiltAndroidTest import org.hamcrest.CoreMatchers.allOf import org.hamcrest.CoreMatchers.instanceOf import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith @HiltAndroidTest @RunWith(AndroidJUnit4::class) class HomeTest { @get:Rule(order = 0) var hiltRule = HiltAndroidRule(this) // Sets the preferences so no welcome screens are shown @get:Rule(order = 1) var preferencesRule = SetPreferencesRule() @get:Rule(order = 2) var activityRule = MainActivityTestRule(R.id.navigation_feed) @Test fun home_basicViewsDisplayed() { // Title onView(allOf(instanceOf(TextView::class.java), withParent(withId(R.id.toolbar)))) .check(matches(withText(R.string.title_home))) // For some reason, recycler view auto scrolls to the bottom in espresso test. Preventing // that by scrolling to the top. onView(withId(R.id.recyclerView)) .perform(actionOnItemAtPosition(0, scrollTo())) // One of the blocks onView(withText(R.string.feed_announcement_title)).check(matches(isDisplayed())) } } ================================================ FILE: mobile/src/androidTest/java/com/google/samples/apps/iosched/tests/ui/InfoTest.kt ================================================ /* * Copyright 2018 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.tests.ui import android.content.Context import android.widget.TextView import androidx.test.core.app.ApplicationProvider import androidx.test.espresso.Espresso.onView import androidx.test.espresso.action.ViewActions.click import androidx.test.espresso.assertion.ViewAssertions.matches import androidx.test.espresso.matcher.ViewMatchers import androidx.test.espresso.matcher.ViewMatchers.isDisplayed import androidx.test.espresso.matcher.ViewMatchers.withParent import androidx.test.espresso.matcher.ViewMatchers.withText import androidx.test.ext.junit.runners.AndroidJUnit4 import com.google.samples.apps.iosched.R import com.google.samples.apps.iosched.R.id import com.google.samples.apps.iosched.tests.SetPreferencesRule import dagger.hilt.android.testing.HiltAndroidRule import dagger.hilt.android.testing.HiltAndroidTest import org.hamcrest.CoreMatchers.allOf import org.hamcrest.CoreMatchers.instanceOf import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith /** * Espresso tests for the Info screen, covering main use case. */ @HiltAndroidTest @RunWith(AndroidJUnit4::class) class InfoTest { @get:Rule(order = 0) var hiltRule = HiltAndroidRule(this) // Sets the preferences so no welcome screens are shown @get:Rule(order = 1) var preferencesRule = SetPreferencesRule() @get:Rule(order = 2) var activityRule = MainActivityTestRule(R.id.navigation_info) private val resources = ApplicationProvider.getApplicationContext().resources @Test fun info_basicViewsDisplayed() { // Title onView(allOf(instanceOf(TextView::class.java), withParent(ViewMatchers.withId(id.toolbar)))) .check(matches(withText(R.string.title_info))) onView(withText(resources.getString(R.string.event_types_header))) .check(matches(isDisplayed())) // Travel tab onView(withText(resources.getString(R.string.travel_title))).perform(click()) onView(withText(resources.getString(R.string.travel_what_to_bring_title))) .check(matches(isDisplayed())) } } ================================================ FILE: mobile/src/androidTest/java/com/google/samples/apps/iosched/tests/ui/MainActivityTestRule.kt ================================================ /* * Copyright 2018 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.tests.ui import android.content.Intent import androidx.test.rule.ActivityTestRule import com.google.samples.apps.iosched.ui.MainActivity /** * ActivityTestRule for [MainActivity] that can launch with any initial navigation target. */ class MainActivityTestRule( private val initialNavId: Int ) : ActivityTestRule(MainActivity::class.java) { override fun getActivityIntent(): Intent { return Intent(Intent.ACTION_MAIN).apply { putExtra(MainActivity.EXTRA_NAVIGATION_ID, initialNavId) } } } ================================================ FILE: mobile/src/androidTest/java/com/google/samples/apps/iosched/tests/ui/MapTest.kt ================================================ /* * Copyright 2018 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.tests.ui import android.widget.TextView import androidx.test.espresso.Espresso.onView import androidx.test.espresso.assertion.ViewAssertions.matches import androidx.test.espresso.matcher.ViewMatchers.withId import androidx.test.espresso.matcher.ViewMatchers.withParent import androidx.test.espresso.matcher.ViewMatchers.withText import androidx.test.ext.junit.runners.AndroidJUnit4 import com.google.samples.apps.iosched.R import com.google.samples.apps.iosched.R.id import com.google.samples.apps.iosched.tests.SetPreferencesRule import dagger.hilt.android.testing.HiltAndroidRule import dagger.hilt.android.testing.HiltAndroidTest import org.hamcrest.CoreMatchers.allOf import org.hamcrest.CoreMatchers.instanceOf import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith /** * Espresso tests for the Map screen. */ @HiltAndroidTest @RunWith(AndroidJUnit4::class) class MapTest { @get:Rule(order = 0) var hiltRule = HiltAndroidRule(this) // Sets the preferences so no welcome screens are shown @get:Rule(order = 1) var preferencesRule = SetPreferencesRule() @get:Rule(order = 2) var activityRule = MainActivityTestRule(R.id.navigation_map) @Test fun map_basicViewsDisplayed() { onView(allOf(instanceOf(TextView::class.java), withParent(withId(id.toolbar)))) .check(matches(withText(R.string.title_map))) } } ================================================ FILE: mobile/src/androidTest/java/com/google/samples/apps/iosched/tests/ui/ScheduleTest.kt ================================================ /* * Copyright 2018 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.tests.ui import android.content.Context import androidx.test.core.app.ApplicationProvider import androidx.test.espresso.Espresso.onView import androidx.test.espresso.action.ViewActions.click import androidx.test.espresso.assertion.ViewAssertions.matches import androidx.test.espresso.contrib.RecyclerViewActions import androidx.test.espresso.matcher.ViewMatchers.isDisplayed import androidx.test.espresso.matcher.ViewMatchers.withId import androidx.test.espresso.matcher.ViewMatchers.withText import androidx.test.ext.junit.runners.AndroidJUnit4 import com.google.samples.apps.iosched.R import com.google.samples.apps.iosched.tests.FixedTimeRule import com.google.samples.apps.iosched.tests.SetPreferencesRule import com.google.samples.apps.iosched.ui.sessioncommon.SessionViewHolder import dagger.hilt.android.testing.HiltAndroidRule import dagger.hilt.android.testing.HiltAndroidTest import org.junit.Ignore import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith /** * Basic Espresso tests for the schedule screen. */ @HiltAndroidTest @RunWith(AndroidJUnit4::class) class ScheduleTest { @get:Rule(order = 0) var hiltRule = HiltAndroidRule(this) // Sets the time to before the conference @get:Rule(order = 1) var timeProviderRule = FixedTimeRule() // Sets the preferences so no welcome screens are shown @get:Rule(order = 1) var preferencesRule = SetPreferencesRule() @get:Rule(order = 2) var activityRule = MainActivityTestRule(R.id.navigation_schedule) private val resources = ApplicationProvider.getApplicationContext().resources @Test fun showFirstDay_sessionOnFirstDayShown() { onView(withText(FAKE_SESSION_ON_DAY1)) .check(matches(isDisplayed())) } @Test @Ignore( "Session Details are shown in another pane owned by a parent fragment. This test runs in " + "a test Activity that does not include the other pane, so it will never pass." ) fun clickOnFirstItem_detailsShown() { onView(withId(R.id.recyclerview_schedule)) .perform(RecyclerViewActions.actionOnItemAtPosition(0, click())) onView(withId(R.id.session_detail_title)).check(matches(isDisplayed())) } /* TODO(jdkoren) move to new schedule screen @Test fun clickFilters_showFilters() { checkAnimationsDisabled() onView(withId(R.id.filter_fab)).perform(click()) val uncheckedFilterContentDesc = getDisabledFilterContDesc(FakeConferenceDataSource.FAKE_SESSION_TAG_NAME) val checkedFilterContentDesc = getActiveFilterContDesc(FakeConferenceDataSource.FAKE_SESSION_TAG_NAME) // Scroll to the filter onView(allOf(withId(R.id.recyclerview_filter), withParent(withId(R.id.filter_sheet)))) .perform( RecyclerViewActions.scrollTo( withContentDescription(uncheckedFilterContentDesc) ) ) onView(withContentDescription(uncheckedFilterContentDesc)) .check(matches(isDisplayed())) .perform(click()) // Check that the filter is enabled onView( allOf( withId(R.id.filter_label), withContentDescription(checkedFilterContentDesc), not(withParent(withId(R.id.filter_description_tags))) ) ) .check(matches(isDisplayed())) .perform(click()) } @Test fun filters_applyAFilter() { checkAnimationsDisabled() val sessionName = FakeConferenceDataSource.FAKE_SESSION_NAME // Apply the filter that will show the session applyFilter(FakeConferenceDataSource.FAKE_SESSION_TAG_NAME) // Check that it's displayed now onView(withText(sessionName)) .check(matches(isDisplayed())) } @Test fun filters_clearFilters() { // Apply the filter that will show the session val filter = FakeConferenceDataSource.FAKE_SESSION_TAG_NAME applyFilter(filter) // Clear onView(withId(R.id.clear_filters_shortcut)).perform(click()) onView( allOf( withId(R.id.filter_label), withContentDescription(getActiveFilterContDesc(filter)), withParent(withId(R.id.filter_description_tags)) ) ).check(matches(isCompletelyDisplayed())) } private fun applyFilter(filter: String) { // Open the filters sheet onView(withId(R.id.filter_fab)).perform(click()) // Get the content description of the view we need to click on val uncheckedFilterContentDesc = resources.getString(R.string.a11y_filter_not_applied, filter) onView(allOf(withId(R.id.recyclerview_filter), withParent(withId(R.id.filter_sheet)))) .check(matches(isDisplayed())) // Scroll to the filter onView(allOf(withId(R.id.recyclerview_filter), withParent(withId(R.id.filter_sheet)))) .perform( RecyclerViewActions.scrollTo( withContentDescription(uncheckedFilterContentDesc) ) ) // Click on the filter onView(withContentDescription(uncheckedFilterContentDesc)) .check(matches(isDisplayed())) .perform(click()) pressBack() } private fun getDisabledFilterContDesc(filter: String) = resources.getString(R.string.a11y_filter_not_applied, filter) private fun getActiveFilterContDesc(filter: String) = resources.getString(R.string.a11y_filter_applied, filter) private fun checkAnimationsDisabled() { val scale = Settings.Global.getFloat( ApplicationProvider.getApplicationContext().contentResolver, Settings.Global.ANIMATOR_DURATION_SCALE, 1f ) if (scale > 0) { throw Exception( "Device must have animations disabled. " + "Developer options -> Animator duration scale" ) } } */ companion object { private const val FAKE_SESSION_ON_DAY1 = "Fake session on day 1" } } ================================================ FILE: mobile/src/androidTest/java/com/google/samples/apps/iosched/tests/ui/SessionDetailTest.kt ================================================ /* * Copyright 2018 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.tests.ui import androidx.test.espresso.Espresso.onView import androidx.test.espresso.assertion.ViewAssertions.matches import androidx.test.espresso.contrib.RecyclerViewActions import androidx.test.espresso.matcher.ViewMatchers.isDisplayed import androidx.test.espresso.matcher.ViewMatchers.withId import androidx.test.espresso.matcher.ViewMatchers.withText import androidx.test.ext.junit.runners.AndroidJUnit4 import com.google.samples.apps.iosched.R import com.google.samples.apps.iosched.shared.data.FakeConferenceDataSource import com.google.samples.apps.iosched.tests.FixedTimeRule import com.google.samples.apps.iosched.tests.SetPreferencesRule import com.google.samples.apps.iosched.tests.di.launchFragmentInHiltContainer import com.google.samples.apps.iosched.ui.sessiondetail.SessionDetailFragment import com.google.samples.apps.iosched.ui.sessiondetail.SessionDetailFragmentArgs import com.google.samples.apps.iosched.ui.sessiondetail.SessionDetailViewHolder import dagger.hilt.android.testing.HiltAndroidRule import dagger.hilt.android.testing.HiltAndroidTest import org.hamcrest.CoreMatchers.allOf import org.junit.Before import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith /** * Espresso tests for the details screen. * * TODO * * Youtube intent * * Information is correct, titles, tags, date and time * * Start event * * Related events present * * Star related events * * Speakers present * * Share intent * * Map intent * * Navigate to related event * * Navigate to speaker * */ @HiltAndroidTest @RunWith(AndroidJUnit4::class) class SessionDetailTest { @get:Rule(order = 0) var hiltRule = HiltAndroidRule(this) // Sets the time to before the conference @get:Rule(order = 1) var timeProviderRule = FixedTimeRule() // Sets the preferences so no welcome screens are shown @get:Rule(order = 1) var preferencesRule = SetPreferencesRule() @Before fun launchScreen() { val fragmentArgs = SessionDetailFragmentArgs(FakeConferenceDataSource.FAKE_SESSION_ID).toBundle() launchFragmentInHiltContainer(fragmentArgs, R.style.AppTheme) } @Test fun details_basicViewsDisplayed() { // On the details screen, scroll down to the speaker onView(withId(R.id.session_detail_recycler_view)) .perform(RecyclerViewActions.scrollToPosition(2)) // Check that the speaker name is displayed onView( allOf( withId(R.id.speaker_item_name), withText(FakeConferenceDataSource.FAKE_SESSION_SPEAKER_NAME) ) ).check(matches(isDisplayed())) // Scroll down to the related events onView(withId(R.id.session_detail_recycler_view)) .perform(RecyclerViewActions.scrollToPosition(4)) // Check that the title is correct onView(allOf(withId(R.id.session_detail_title), withText("Fake session on day 1"))) .check(matches(isDisplayed())) } } ================================================ FILE: mobile/src/androidTest/java/com/google/samples/apps/iosched/tests/ui/SettingsTest.kt ================================================ /* * Copyright 2019 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.tests.ui import android.content.Context import android.widget.TextView import androidx.test.core.app.ApplicationProvider import androidx.test.espresso.Espresso.onView import androidx.test.espresso.assertion.ViewAssertions.matches import androidx.test.espresso.matcher.ViewMatchers.isDisplayed import androidx.test.espresso.matcher.ViewMatchers.withId import androidx.test.espresso.matcher.ViewMatchers.withParent import androidx.test.espresso.matcher.ViewMatchers.withText import androidx.test.ext.junit.runners.AndroidJUnit4 import com.google.samples.apps.iosched.R import com.google.samples.apps.iosched.R.id import com.google.samples.apps.iosched.tests.SetPreferencesRule import dagger.hilt.android.testing.HiltAndroidRule import dagger.hilt.android.testing.HiltAndroidTest import org.hamcrest.CoreMatchers.allOf import org.hamcrest.CoreMatchers.instanceOf import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith /** * Espresso tests for Settings screen */ @HiltAndroidTest @RunWith(AndroidJUnit4::class) class SettingsTest { @get:Rule(order = 0) var hiltRule = HiltAndroidRule(this) // Sets the preferences so no welcome screens are shown @get:Rule(order = 1) var preferencesRule = SetPreferencesRule() @get:Rule(order = 2) var activityRule = MainActivityTestRule(R.id.navigation_settings) private val resources = ApplicationProvider.getApplicationContext().resources @Test fun settings_basicViewsDisplayed() { // Title onView(allOf(instanceOf(TextView::class.java), withParent(withId(id.toolbar)))) .check(matches(withText(R.string.settings_title))) // Preference toggle onView(withText(resources.getString(R.string.settings_enable_notifications))) .check(matches(isDisplayed())) // About label onView(withText(resources.getString(R.string.about_title))) .check(matches(isDisplayed())) } } ================================================ FILE: mobile/src/debugRelease/java/com/google/samples/apps/iosched/di/SignInModule.kt ================================================ /* * Copyright 2018 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.di import com.google.firebase.auth.FirebaseAuth import com.google.firebase.auth.ktx.auth import com.google.firebase.firestore.FirebaseFirestore import com.google.firebase.ktx.Firebase import com.google.samples.apps.iosched.shared.data.signin.datasources.AuthIdDataSource import com.google.samples.apps.iosched.shared.data.signin.datasources.AuthStateUserDataSource import com.google.samples.apps.iosched.shared.data.signin.datasources.FirebaseAuthStateUserDataSource import com.google.samples.apps.iosched.shared.data.signin.datasources.FirestoreRegisteredUserDataSource import com.google.samples.apps.iosched.shared.data.signin.datasources.RegisteredUserDataSource import com.google.samples.apps.iosched.shared.di.ApplicationScope import com.google.samples.apps.iosched.shared.di.IoDispatcher import com.google.samples.apps.iosched.shared.di.MainDispatcher import com.google.samples.apps.iosched.shared.domain.sessions.NotificationAlarmUpdater import com.google.samples.apps.iosched.shared.fcm.FcmTokenUpdater import com.google.samples.apps.iosched.util.signin.FirebaseAuthSignInHandler import com.google.samples.apps.iosched.util.signin.SignInHandler import dagger.Module import dagger.Provides import dagger.hilt.InstallIn import dagger.hilt.components.SingletonComponent import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.CoroutineScope import javax.inject.Singleton @InstallIn(SingletonComponent::class) @Module internal class SignInModule { @Provides fun provideSignInHandler( @ApplicationScope applicationScope: CoroutineScope ): SignInHandler = FirebaseAuthSignInHandler(applicationScope) @Singleton @Provides fun provideRegisteredUserDataSource( firestore: FirebaseFirestore ): RegisteredUserDataSource { return FirestoreRegisteredUserDataSource(firestore) } @Singleton @Provides fun provideAuthStateUserDataSource( firebase: FirebaseAuth, firestore: FirebaseFirestore, notificationAlarmUpdater: NotificationAlarmUpdater, @ApplicationScope applicationScope: CoroutineScope, @IoDispatcher ioDispatcher: CoroutineDispatcher, @MainDispatcher mainDispatcher: CoroutineDispatcher ): AuthStateUserDataSource { return FirebaseAuthStateUserDataSource( firebase, FcmTokenUpdater(applicationScope, mainDispatcher, firestore), notificationAlarmUpdater, applicationScope, ioDispatcher ) } @Singleton @Provides fun provideFirebaseAuth(): FirebaseAuth { return Firebase.auth } @Singleton @Provides fun providesAuthIdDataSource( firebaseAuth: FirebaseAuth ): AuthIdDataSource { return object : AuthIdDataSource { override fun getUserId() = firebaseAuth.currentUser?.uid } } } ================================================ FILE: mobile/src/main/AndroidManifest.xml ================================================ ================================================ FILE: mobile/src/main/assets/anim/0.json ================================================ {"v":"5.4.3","fr":30,"ip":0,"op":45,"w":130,"h":194,"nm":"00","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":".number-0 .darkfill","cl":"number-0 darkfill","td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[69,97,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[60.061,31.625],[-67.939,31.625],[-67.939,-32.375],[60.061,-32.375]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.203921571374,0.658823549747,0.32549020648,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":45,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":".number-0 .darkfill","cl":"number-0 darkfill","tt":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.16,"y":1},"o":{"x":0.84,"y":0},"n":"0p16_1_0p84_0","t":0,"s":[-61,97,0],"e":[69,97,0],"to":[21.6666660308838,0,0],"ti":[-21.6666660308838,0,0]},{"i":{"x":0.16,"y":0.16},"o":{"x":0.84,"y":0.84},"n":"0p16_0p16_0p84_0p84","t":15,"s":[69,97,0],"e":[69,97,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.16,"y":1},"o":{"x":0.84,"y":0},"n":"0p16_1_0p84_0","t":30,"s":[69,97,0],"e":[-61,97,0],"to":[-21.6666660308838,0,0],"ti":[21.6666660308838,0,0]},{"t":44}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[60.061,31.625],[-67.939,31.625],[-67.939,-32.375],[60.061,-32.375]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.203921571374,0.658823549747,0.32549020648,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":".darkfill","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false,"cl":"darkfill"}],"ip":0,"op":45,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":".number-0 .lightfill","cl":"number-0 lightfill","td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[69,97,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-35.346,0],[0,35.346],[0,0]],"o":[[35.346,0],[0,0],[0,35.346]],"v":[[-3.939,95.625],[60.061,31.625],[-67.939,31.625]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.807843148708,0.917647063732,0.839215695858,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":45,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":".number-0. lightfill","cl":"number-0 ","tt":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.16,"y":1},"o":{"x":0.84,"y":0},"n":"0p16_1_0p84_0","t":0,"s":[69,31.5,0],"e":[69,97,0],"to":[0,10.9166669845581,0],"ti":[0,-10.9166669845581,0]},{"i":{"x":0.629,"y":0.629},"o":{"x":0.912,"y":0.912},"n":"0p629_0p629_0p912_0p912","t":15,"s":[69,97,0],"e":[69,97,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.16,"y":1},"o":{"x":0.84,"y":0},"n":"0p16_1_0p84_0","t":30,"s":[69,97,0],"e":[69,31.5,0],"to":[0,-10.9166669845581,0],"ti":[0,10.9166669845581,0]},{"t":44}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-35.346,0],[0,35.346],[0,0]],"o":[[35.346,0],[0,0],[0,35.346]],"v":[[-3.939,95.625],[60.061,31.625],[-67.939,31.625]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.807843148708,0.917647063732,0.839215695858,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":".lightfill","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false,"cl":"lightfill"}],"ip":0,"op":45,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":".number-0 .lightstroke","cl":"number-0 lightstroke","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[69,97,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-33.073,0],[-1.317,-32.755]],"o":[[1.317,-32.755],[33.073,0],[0,0]],"v":[[-65.389,-34.875],[-3.939,-93.875],[57.51,-34.875]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.807843148708,0.917647063732,0.839215695858,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":5,"ix":5},"lc":1,"lj":1,"ml":10,"ml2":{"a":0,"k":10,"ix":8},"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":".lightstroke","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false,"cl":"lightstroke"},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.16],"y":[1]},"o":{"x":[0.84],"y":[0]},"n":["0p16_1_0p84_0"],"t":0,"s":[100],"e":[0]},{"i":{"x":[0.16],"y":[1]},"o":{"x":[0.84],"y":[0]},"n":["0p16_1_0p84_0"],"t":15,"s":[0],"e":[0]},{"i":{"x":[0.16],"y":[1]},"o":{"x":[0.84],"y":[0]},"n":["0p16_1_0p84_0"],"t":30,"s":[0],"e":[100]},{"t":44}],"ix":1},"e":{"a":0,"k":100,"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":0,"op":45,"st":0,"bm":0}],"markers":[{"tm":15,"cm":"1","dr":0},{"tm":30,"cm":"2","dr":0}]} ================================================ FILE: mobile/src/main/assets/anim/1.json ================================================ {"v":"5.4.3","fr":30,"ip":0,"op":45,"w":130,"h":193,"nm":"01","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":".number-1","cl":"number-1","td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[34.5,96.5,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.833,1.332],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[-1.571,0]],"v":[[-34.027,-34.935],[4.061,-95.875],[60.061,-95.875],[60.061,-31.875],[-32.331,-31.875]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.984313726425,0.737254917622,0.015686275437,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":45,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":".number-1 .darkfill","cl":"number-1 darkfill","tt":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.16,"y":1},"o":{"x":0.84,"y":0},"n":"0p16_1_0p84_0","t":0,"s":[34.5,162,0],"e":[34.5,96.5,0],"to":[0,-10.9166669845581,0],"ti":[0,10.9166669845581,0]},{"i":{"x":0.16,"y":0.16},"o":{"x":0.84,"y":0.84},"n":"0p16_0p16_0p84_0p84","t":15,"s":[34.5,96.5,0],"e":[34.5,96.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.16,"y":1},"o":{"x":0.84,"y":0},"n":"0p16_1_0p84_0","t":30,"s":[34.5,96.5,0],"e":[34.5,162,0],"to":[0,10.9166669845581,0],"ti":[0,-10.9166669845581,0]},{"t":44}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.833,1.332],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[-1.571,0]],"v":[[-34.027,-34.935],[-9.065,-74.875],[4.061,-95.875],[60.061,-95.875],[60.061,-31.875],[-32.331,-31.875]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.984313726425,0.737254917622,0.015686275437,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":".darkfill","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false,"cl":"darkfill"}],"ip":0,"op":45,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":".number-1 .lightfill","cl":"number-1 lightfill","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[34.5,96.5,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-1.85,93.625],[-1.85,-29.375],[57.15,-29.375],[57.15,93.625]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.996078431373,0.937254901961,0.764705882353,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"lc":1,"lj":1,"ml":10,"ml2":{"a":0,"k":10,"ix":8},"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":".lightstroke","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false,"cl":"lightstroke"},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.16],"y":[1]},"o":{"x":[0.84],"y":[0]},"n":["0p16_1_0p84_0"],"t":0,"s":[100],"e":[0]},{"i":{"x":[0.16],"y":[1]},"o":{"x":[0.84],"y":[0]},"n":["0p16_1_0p84_0"],"t":15,"s":[0],"e":[0]},{"i":{"x":[0.16],"y":[1]},"o":{"x":[0.84],"y":[0]},"n":["0p16_1_0p84_0"],"t":30,"s":[0],"e":[100]},{"t":44}],"ix":1},"e":{"a":0,"k":100,"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":0,"op":45,"st":0,"bm":0}],"markers":[{"tm":15,"cm":"1","dr":0},{"tm":30,"cm":"2","dr":0}]} ================================================ FILE: mobile/src/main/assets/anim/2.json ================================================ {"v":"5.4.3","fr":30,"ip":0,"op":45,"w":130,"h":193,"nm":"02","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":".number-2","cl":"number-2","td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":15,"s":[69,95,0],"e":[69,95,0],"to":[0,0,0],"ti":[0,0,0]},{"t":30}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,35.346],[0,0],[0,0]],"o":[[0,0],[0,0],[35.346,0]],"v":[[60.061,-31.375],[-3.939,-31.375],[-3.939,32.625]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.258823543787,0.521568655968,0.956862747669,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":45,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":".number-2 .darkfill","cl":"number-2 darkfill","tt":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.271,"y":0.895},"o":{"x":0.912,"y":0},"n":"0p271_0p895_0p912_0","t":0,"s":[69,29,0],"e":[69,94.843,0],"to":[0,10.7926044464111,0],"ti":[0,-11.9904975891113,0]},{"i":{"x":0.629,"y":1},"o":{"x":0.138,"y":1},"n":"0p629_1_0p138_1","t":13,"s":[69,94.843,0],"e":[69,95,0],"to":[0,0.23041497170925,0],"ti":[0,-0.20739570260048,0]},{"i":{"x":-0.037,"y":-0.037},"o":{"x":0.545,"y":0.545},"n":"-0p037_-0p037_0p545_0p545","t":15,"s":[69,95,0],"e":[69,95,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.16,"y":1},"o":{"x":0.84,"y":0},"n":"0p16_1_0p84_0","t":30,"s":[69,95,0],"e":[69,29,0],"to":[0,-11,0],"ti":[0,11,0]},{"t":44}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,35.346],[0,0],[0,0]],"o":[[0,0],[0,0],[35.346,0]],"v":[[60.061,-31.375],[-3.939,-31.375],[-3.939,32.625]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.258823543787,0.521568655968,0.956862747669,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":".darkfill","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false,"cl":"darkfill"}],"ip":0,"op":45,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":".number-2","cl":"number-2","td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[69,95.5,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[60.061,96.625],[-67.939,96.625],[-67.939,32.625],[60.061,32.625]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.823529422283,0.890196084976,0.988235294819,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":45,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":".number-2 .lightfill","cl":"number-2 lightfill","tt":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.16,"y":1},"o":{"x":0.84,"y":0},"n":"0p16_1_0p84_0","t":0,"s":[-58.5,94,0],"e":[70,94,0],"to":[21.4166660308838,0,0],"ti":[-21.4166660308838,0,0]},{"i":{"x":-0.037,"y":-0.037},"o":{"x":0.545,"y":0.545},"n":"-0p037_-0p037_0p545_0p545","t":15,"s":[70,94,0],"e":[70,94,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.16,"y":1},"o":{"x":0.84,"y":0},"n":"0p16_1_0p84_0","t":30,"s":[70,94,0],"e":[-58.5,94,0],"to":[-21.4166660308838,0,0],"ti":[21.4166660308838,0,0]},{"t":44}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[60.061,96.625],[-67.939,96.625],[-67.939,32.625],[60.061,32.625]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.823529422283,0.890196084976,0.988235294819,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":".lightfill","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false,"cl":"lightfill"}],"ip":0,"op":45,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":".number-2 .darkstroke","cl":"number-2 darkstroke","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[69,95.5,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-63.429,30.125],[-26.554,-28.875],[-6.439,-28.875],[-6.439,30.125]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.68235296011,0.796078443527,0.96862745285,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":5,"ix":5},"lc":1,"lj":1,"ml":10,"ml2":{"a":0,"k":10,"ix":8},"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":".darkstroke","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false,"cl":"darkstroke"},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.16],"y":[1]},"o":{"x":[0.84],"y":[0]},"n":["0p16_1_0p84_0"],"t":0,"s":[100],"e":[0]},{"i":{"x":[0.16],"y":[1]},"o":{"x":[0.84],"y":[0]},"n":["0p16_1_0p84_0"],"t":15,"s":[0],"e":[0]},{"i":{"x":[0.16],"y":[1]},"o":{"x":[0.84],"y":[0]},"n":["0p16_1_0p84_0"],"t":30,"s":[0],"e":[100]},{"t":44}],"ix":1},"e":{"a":0,"k":100,"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":0,"op":45,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":".number-2 .lightstroke","cl":"number-2 lightstroke","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[69,95.5,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-33.073,0],[-1.317,-32.755]],"o":[[1.317,-32.755],[33.073,0],[0,0]],"v":[[-65.389,-33.875],[-3.939,-92.875],[57.51,-33.875]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.823529422283,0.890196084976,0.988235294819,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":5,"ix":5},"lc":1,"lj":1,"ml":10,"ml2":{"a":0,"k":10,"ix":8},"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":".lightstroke","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false,"cl":"lightstroke"},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.16],"y":[1]},"o":{"x":[0.84],"y":[0]},"n":["0p16_1_0p84_0"],"t":0,"s":[100],"e":[0]},{"i":{"x":[0.16],"y":[1]},"o":{"x":[0.84],"y":[0]},"n":["0p16_1_0p84_0"],"t":15,"s":[0],"e":[0]},{"i":{"x":[0.16],"y":[1]},"o":{"x":[0.84],"y":[0]},"n":["0p16_1_0p84_0"],"t":30,"s":[0],"e":[100]},{"t":44}],"ix":1},"e":{"a":0,"k":100,"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":0,"op":45,"st":0,"bm":0}],"markers":[{"tm":15,"cm":"1","dr":0},{"tm":30,"cm":"2","dr":0}]} ================================================ FILE: mobile/src/main/assets/anim/3.json ================================================ {"v":"5.4.3","fr":30,"ip":0,"op":45,"w":140,"h":194,"nm":"03","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":".number-3 .darkstroke","cl":"number-3 darkstroke","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[73.5,97,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-1.439,30.125],[-1.439,-28.875],[57.561,-28.875],[57.561,30.125]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.658823549747,0.854901969433,0.709803938866,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":5,"ix":5},"lc":1,"lj":1,"ml":10,"ml2":{"a":0,"k":10,"ix":8},"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":".darkstroke","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false,"cl":"darkstroke"},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.16],"y":[1]},"o":{"x":[0.84],"y":[0]},"n":["0p16_1_0p84_0"],"t":0,"s":[100],"e":[0]},{"i":{"x":[0.16],"y":[1]},"o":{"x":[0.84],"y":[0]},"n":["0p16_1_0p84_0"],"t":15,"s":[0],"e":[0]},{"i":{"x":[0.16],"y":[1]},"o":{"x":[0.84],"y":[0]},"n":["0p16_1_0p84_0"],"t":30,"s":[0],"e":[100]},{"t":44}],"ix":1},"e":{"a":0,"k":100,"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":0,"op":45,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":".number-3","cl":"number-3","td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.16,"y":1},"o":{"x":0.84,"y":0},"n":"0p16_1_0p84_0","t":0,"s":[73.5,32,0],"e":[73.5,97,0],"to":[0,10.8333330154419,0],"ti":[0,-10.8333330154419,0]},{"i":{"x":0.16,"y":0.16},"o":{"x":0.84,"y":0.84},"n":"0p16_0p16_0p84_0p84","t":15,"s":[73.5,97,0],"e":[73.5,97,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.16,"y":1},"o":{"x":0.84,"y":0},"n":"0p16_1_0p84_0","t":30,"s":[73.5,97,0],"e":[73.5,32,0],"to":[0,-10.8333330154419,0],"ti":[0,10.8333330154419,0]},{"t":44}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-35.346,0],[0,35.346],[0,0]],"o":[[35.346,0],[0,0],[0,35.346]],"v":[[-3.939,96.625],[60.061,32.625],[-67.939,32.625]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.807843148708,0.917647063732,0.839215695858,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":45,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":".number-3 .lightfill","cl":"number-3 lightfill","tt":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[74,97,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-35.346,0],[0,35.346],[0,0]],"o":[[35.346,0],[0,0],[0,35.346]],"v":[[-3.939,96.625],[60.061,32.625],[-67.939,32.625]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.807843148708,0.917647063732,0.839215695858,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":".lightfill","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false,"cl":"lightfill"}],"ip":0,"op":45,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":".number-3","cl":"number-3","td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[74,97,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-17.673],[-17.673,0],[0,0]],"o":[[0,17.673],[0,0],[-17.673,0]],"v":[[-35.939,0.625],[-3.939,32.625],[-3.939,-31.375]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.203921571374,0.658823549747,0.32549020648,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":45,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":".number-3 .darkfill","cl":"number-3 darkfill","tt":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.16,"y":1},"o":{"x":0.84,"y":0},"n":"0p16_1_0p84_0","t":0,"s":[108.5,97,0],"e":[73.5,97,0],"to":[-5.83333349227905,0,0],"ti":[5.83333349227905,0,0]},{"i":{"x":0.16,"y":0.16},"o":{"x":0.84,"y":0.84},"n":"0p16_0p16_0p84_0p84","t":15,"s":[73.5,97,0],"e":[73.5,97,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.16,"y":1},"o":{"x":0.84,"y":0},"n":"0p16_1_0p84_0","t":30,"s":[73.5,97,0],"e":[108.5,97,0],"to":[5.83333349227905,0,0],"ti":[-5.83333349227905,0,0]},{"t":44}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-17.673],[-17.673,0],[0,0]],"o":[[0,17.673],[0,0],[-17.673,0]],"v":[[-35.939,0.625],[-3.939,32.625],[-3.939,-31.375]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.203921571374,0.658823549747,0.32549020648,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":".darkfill","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false,"cl":"darkfill"}],"ip":0,"op":45,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":".number-3 .lightstroke","cl":"number-3 lightstroke","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[73.5,97,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-33.073,0],[-1.317,-32.755]],"o":[[1.317,-32.755],[33.073,0],[0,0]],"v":[[-65.389,-33.875],[-3.939,-92.875],[57.51,-33.875]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.807843148708,0.917647063732,0.839215695858,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":5,"ix":5},"lc":1,"lj":1,"ml":10,"ml2":{"a":0,"k":10,"ix":8},"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":".lightstroke","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false,"cl":"lightstroke"},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.16],"y":[1]},"o":{"x":[0.84],"y":[0]},"n":["0p16_1_0p84_0"],"t":0,"s":[100],"e":[0]},{"i":{"x":[0.16],"y":[1]},"o":{"x":[0.84],"y":[0]},"n":["0p16_1_0p84_0"],"t":15,"s":[0],"e":[0]},{"i":{"x":[0.16],"y":[1]},"o":{"x":[0.84],"y":[0]},"n":["0p16_1_0p84_0"],"t":30,"s":[0],"e":[100]},{"t":44}],"ix":1},"e":{"a":0,"k":100,"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":0,"op":45,"st":0,"bm":0}],"markers":[{"tm":15,"cm":"1","dr":0},{"tm":30,"cm":"2","dr":0}]} ================================================ FILE: mobile/src/main/assets/anim/4.json ================================================ {"v":"5.4.3","fr":30,"ip":0,"op":45,"w":130,"h":193,"nm":"04","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":".number-4","cl":"number-4","td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[68,96.5,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-3.939,32.125],[60.061,32.125],[60.061,-31.875],[-3.939,-31.875]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.898039221764,0.266666680574,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":45,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":".number-4 .darkfill","cl":"number-4 darkfill","tt":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.16,"y":1},"o":{"x":0.84,"y":0},"n":"0p16_1_0p84_0","t":0,"s":[3,96.5,0],"e":[68,96.5,0],"to":[10.8333330154419,0,0],"ti":[-10.8333330154419,0,0]},{"i":{"x":0.16,"y":0.16},"o":{"x":0.84,"y":0.84},"n":"0p16_0p16_0p84_0p84","t":15,"s":[68,96.5,0],"e":[68,96.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.16,"y":1},"o":{"x":0.84,"y":0},"n":"0p16_1_0p84_0","t":30,"s":[68,96.5,0],"e":[3,96.5,0],"to":[-10.8333330154419,0,0],"ti":[10.8333330154419,0,0]},{"t":44}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-3.939,32.125],[60.061,32.125],[60.061,-31.875],[-3.939,-31.875]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.898039221764,0.266666680574,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":".darkfill","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false,"cl":"darkfill"}],"ip":0,"op":45,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":".number-4 .lightstroke","cl":"number-4 lightstroke","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[68,96.5,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-65.439,29.625],[-65.439,-54.489],[-6.439,-91.364],[-6.439,29.625]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.980392158031,0.823529422283,0.811764717102,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":5,"ix":5},"lc":1,"lj":1,"ml":10,"ml2":{"a":0,"k":10,"ix":8},"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":".darkstroke","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false,"cl":"darkstroke"},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.16],"y":[1]},"o":{"x":[0.84],"y":[0]},"n":["0p16_1_0p84_0"],"t":0,"s":[100],"e":[0]},{"i":{"x":[0.16],"y":[1]},"o":{"x":[0.84],"y":[0]},"n":["0p16_1_0p84_0"],"t":15,"s":[0],"e":[0]},{"i":{"x":[0.16],"y":[1]},"o":{"x":[0.84],"y":[0]},"n":["0p16_1_0p84_0"],"t":30,"s":[0],"e":[100]},{"t":44}],"ix":1},"e":{"a":0,"k":100,"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":0,"op":45,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":".number-4 .darkstroke","cl":"number-4 darkstroke","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[68,96.5,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-1.439,93.625],[-1.439,34.625],[57.561,34.625],[57.561,93.625]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.980392158031,0.823529422283,0.811764717102,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":5,"ix":5},"lc":1,"lj":1,"ml":10,"ml2":{"a":0,"k":10,"ix":8},"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":".lightstroke","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false,"cl":"lightstroke"},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.16],"y":[1]},"o":{"x":[0.84],"y":[0]},"n":["0p16_1_0p84_0"],"t":0,"s":[100],"e":[0]},{"i":{"x":[0.16],"y":[1]},"o":{"x":[0.84],"y":[0]},"n":["0p16_1_0p84_0"],"t":15,"s":[0],"e":[0]},{"i":{"x":[0.16],"y":[1]},"o":{"x":[0.84],"y":[0]},"n":["0p16_1_0p84_0"],"t":30,"s":[0],"e":[100]},{"t":44}],"ix":1},"e":{"a":0,"k":100,"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":0,"op":45,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":".number-4 .darkfill","cl":"number-4 darkfill","td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[68,96.5,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-3.939,32.125],[60.061,32.125],[60.061,-31.875],[-3.939,-31.875]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.898039221764,0.266666680574,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":45,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":".number-4 .lightfill","cl":"number-4 lightfill","tt":2,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.16,"y":1},"o":{"x":0.84,"y":0},"n":"0p16_1_0p84_0","t":0,"s":[68,160,0],"e":[68,96.5,0],"to":[0,-10.5833330154419,0],"ti":[0,10.5833330154419,0]},{"i":{"x":0.16,"y":0.16},"o":{"x":0.84,"y":0.84},"n":"0p16_0p16_0p84_0p84","t":15,"s":[68,96.5,0],"e":[68,96.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.16,"y":1},"o":{"x":0.84,"y":0},"n":"0p16_1_0p84_0","t":30,"s":[68,96.5,0],"e":[68,160,0],"to":[0,10.5833330154419,0],"ti":[0,-10.5833330154419,0]},{"t":44}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-17.673],[17.673,0],[0,17.673],[-17.673,0]],"o":[[0,17.673],[-17.673,0],[0,-17.673],[17.673,0]],"v":[[60.061,-63.875],[28.061,-31.875],[-3.939,-63.875],[28.061,-95.875]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.988235294819,0.909803926945,0.901960790157,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":".lightfill","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false,"cl":"lightfill"}],"ip":0,"op":45,"st":0,"bm":0}],"markers":[{"tm":15,"cm":"1","dr":0},{"tm":30,"cm":"2","dr":0}]} ================================================ FILE: mobile/src/main/assets/anim/5.json ================================================ {"v":"5.4.3","fr":30,"ip":0,"op":45,"w":130,"h":195,"nm":"05","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":".number-5 .lightstroke","cl":"number-5 lightstroke","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[69,97.5,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[16.266,0],[0,16.266],[-16.266,0],[0,-16.266]],"o":[[-16.266,0],[0,-16.266],[16.266,0],[0,16.266]],"v":[[-35.939,93.625],[-65.439,64.125],[-35.939,34.625],[-6.439,64.125]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.823529422283,0.890196084976,0.988235294819,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":5,"ix":5},"lc":1,"lj":1,"ml":10,"ml2":{"a":0,"k":10,"ix":8},"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":".lightstroke","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false,"cl":"lightstroke"},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.16],"y":[1]},"o":{"x":[0.84],"y":[0]},"n":["0p16_1_0p84_0"],"t":0,"s":[100],"e":[0]},{"i":{"x":[0.16],"y":[1]},"o":{"x":[0.84],"y":[0]},"n":["0p16_1_0p84_0"],"t":15,"s":[0],"e":[0]},{"i":{"x":[0.16],"y":[1]},"o":{"x":[0.84],"y":[0]},"n":["0p16_1_0p84_0"],"t":30,"s":[0],"e":[100]},{"t":44}],"ix":1},"e":{"a":0,"k":100,"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":0,"op":45,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":".number-5","cl":"number-5","td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[65.061,34.125,0],"ix":2},"a":{"a":0,"k":[-3.939,-63.875,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[60.061,-31.875],[-67.939,-31.875],[-67.939,-95.875],[60.061,-95.875]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.823529422283,0.890196084976,0.988235294819,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":45,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":".number-5 .lightfill","cl":"number-5 lightfill","tt":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.16,"y":1},"o":{"x":0.84,"y":0},"n":"0p16_1_0p84_0","t":0,"s":[-61,97.5,0],"e":[69,97.5,0],"to":[21.6666660308838,0,0],"ti":[-21.6666660308838,0,0]},{"i":{"x":0.16,"y":0.16},"o":{"x":0.84,"y":0.84},"n":"0p16_0p16_0p84_0p84","t":15,"s":[69,97.5,0],"e":[69,97.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.16,"y":1},"o":{"x":0.84,"y":0},"n":"0p16_1_0p84_0","t":30,"s":[69,97.5,0],"e":[-61,97.5,0],"to":[-21.6666660308838,0,0],"ti":[21.6666660308838,0,0]},{"t":44}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[60.061,-31.875],[-67.939,-31.875],[-67.939,-95.875],[60.061,-95.875]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.823529422283,0.890196084976,0.988235294819,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":".lightfill","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false,"cl":"lightfill"}],"ip":0,"op":45,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":".number-5 .darkstroke","cl":"number-5 darkstroke","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[69,97.5,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,-33.073],[32.755,-1.317]],"o":[[32.755,1.317],[0,33.073],[0,0]],"v":[[-1.439,-29.325],[57.561,32.125],[-1.439,93.575]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.68235296011,0.796078443527,0.96862745285,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":5,"ix":5},"lc":1,"lj":1,"ml":10,"ml2":{"a":0,"k":10,"ix":8},"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":".darkstroke","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false,"cl":"darkstroke"},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.16],"y":[1]},"o":{"x":[0.84],"y":[0]},"n":["0p16_1_0p84_0"],"t":0,"s":[100],"e":[0]},{"i":{"x":[0.16],"y":[1]},"o":{"x":[0.84],"y":[0]},"n":["0p16_1_0p84_0"],"t":15,"s":[0],"e":[0]},{"i":{"x":[0.16],"y":[1]},"o":{"x":[0.84],"y":[0]},"n":["0p16_1_0p84_0"],"t":30,"s":[0],"e":[100]},{"t":44}],"ix":1},"e":{"a":0,"k":100,"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":0,"op":45,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":".number-5","cl":"number-5","td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":15,"s":[69,97.5,0],"e":[69,97.5,0],"to":[0,0,0],"ti":[0,0,0]},{"t":30}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-3.939,32.125],[-67.939,-7.875],[-67.939,-31.875],[-3.939,-31.875]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.258823543787,0.521568655968,0.956862747669,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":45,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":".number-5 .darkfill","cl":"number-5 darkfill","tt":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.16,"y":1},"o":{"x":0.84,"y":0},"n":"0p16_1_0p84_0","t":0,"s":[69,32.5,0],"e":[69,97.5,0],"to":[0,10.8333330154419,0],"ti":[0,-10.8333330154419,0]},{"i":{"x":0.16,"y":0.16},"o":{"x":0.84,"y":0.84},"n":"0p16_0p16_0p84_0p84","t":15,"s":[69,97.5,0],"e":[69,97.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.16,"y":1},"o":{"x":0.84,"y":0},"n":"0p16_1_0p84_0","t":30,"s":[69,97.5,0],"e":[69,32.5,0],"to":[0,-10.8333330154419,0],"ti":[0,10.8333330154419,0]},{"t":44}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-3.939,32.125],[-67.939,-7.875],[-67.939,-31.875],[-3.939,-31.875]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.258823543787,0.521568655968,0.956862747669,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":".darkfill","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false,"cl":"darkfill"}],"ip":0,"op":45,"st":0,"bm":0}],"markers":[]} ================================================ FILE: mobile/src/main/assets/anim/6.json ================================================ {"v":"5.4.3","fr":30,"ip":0,"op":45,"w":130,"h":195,"nm":"06","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":".number-6","cl":"number-6","td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[69,97.688,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[35.346,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,-35.346]],"v":[[-3.939,-32.375],[-3.939,31.625],[60.061,31.625]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.203921571374,0.658823549747,0.32549020648,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":45,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":".number-6 .darkfill","cl":"number-6 darkfill","tt":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.16,"y":1},"o":{"x":0.84,"y":0},"n":"0p16_1_0p84_0","t":0,"s":[2,97.75,0],"e":[69,97.75,0],"to":[11.1666669845581,0,0],"ti":[-11.1666669845581,0,0]},{"i":{"x":0.16,"y":0.16},"o":{"x":0.84,"y":0.84},"n":"0p16_0p16_0p84_0p84","t":15,"s":[69,97.75,0],"e":[69,97.75,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.16,"y":1},"o":{"x":0.84,"y":0},"n":"0p16_1_0p84_0","t":30,"s":[69,97.75,0],"e":[2,97.75,0],"to":[-11.1666669845581,0,0],"ti":[11.1666669845581,0,0]},{"t":44}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[35.346,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,-35.346]],"v":[[-3.939,-32.375],[-3.939,31.625],[60.061,31.625]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.203921571374,0.658823549747,0.32549020648,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":".darkfill","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false,"cl":"darkfill"}],"ip":0,"op":45,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":".number-6","cl":"number-6","td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[69,97.5,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-35.346,0],[0,35.346],[0,0]],"o":[[35.346,0],[0,0],[0,35.346]],"v":[[-3.939,95.625],[60.061,31.625],[-67.939,31.625]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.807843148708,0.917647063732,0.839215695858,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":45,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":".number-6 .lightfill","cl":"number-6 lightfill","tt":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.16,"y":1},"o":{"x":0.84,"y":0},"n":"0p16_1_0p84_0","t":0,"s":[69,31.5,0],"e":[69,97.5,0],"to":[0,11,0],"ti":[0,-11,0]},{"i":{"x":0.16,"y":0.16},"o":{"x":0.84,"y":0.84},"n":"0p16_0p16_0p84_0p84","t":15,"s":[69,97.5,0],"e":[69,97.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.16,"y":1},"o":{"x":0.84,"y":0},"n":"0p16_1_0p84_0","t":30,"s":[69,97.5,0],"e":[69,31.5,0],"to":[0,-11,0],"ti":[0,11,0]},{"t":44}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-35.346,0],[0,35.346],[0,0]],"o":[[35.346,0],[0,0],[0,35.346]],"v":[[-3.939,95.625],[60.061,31.625],[-67.939,31.625]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.807843148708,0.917647063732,0.839215695858,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":".lightfill","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false,"cl":"lightfill"}],"ip":0,"op":45,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":".number-6 .darkstroke","cl":"number-6 darkstroke","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[69,97.5,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-32.755,1.317],[0,0]],"o":[[0,0],[0,-33.073],[0,0],[0,0]],"v":[[-65.439,29.125],[-65.439,-32.375],[-6.439,-93.825],[-6.439,29.125]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.658823549747,0.854901969433,0.709803938866,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":5,"ix":5},"lc":1,"lj":1,"ml":10,"ml2":{"a":0,"k":10,"ix":8},"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":".darkstroke","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false,"cl":"darkstroke"},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.16],"y":[1]},"o":{"x":[0.84],"y":[0]},"n":["0p16_1_0p84_0"],"t":0,"s":[100],"e":[0]},{"i":{"x":[0.16],"y":[1]},"o":{"x":[0.84],"y":[0]},"n":["0p16_1_0p84_0"],"t":15,"s":[0],"e":[0]},{"i":{"x":[0.16],"y":[1]},"o":{"x":[0.84],"y":[0]},"n":["0p16_1_0p84_0"],"t":30,"s":[0],"e":[100]},{"t":44}],"ix":1},"e":{"a":0,"k":100,"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":0,"op":45,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":".number-6 .lightstroke","cl":"number-6 lightstroke","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[69,97.5,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[16.266,0],[0,16.266],[-16.266,0],[0,-16.266]],"o":[[-16.266,0],[0,-16.266],[16.266,0],[0,16.266]],"v":[[28.061,-34.875],[-1.439,-64.375],[28.061,-93.875],[57.561,-64.375]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.807843148708,0.917647063732,0.839215695858,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":5,"ix":5},"lc":1,"lj":1,"ml":10,"ml2":{"a":0,"k":10,"ix":8},"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":".lightstroke","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false,"cl":"lightstroke"},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.16],"y":[1]},"o":{"x":[0.84],"y":[0]},"n":["0p16_1_0p84_0"],"t":0,"s":[100],"e":[0]},{"i":{"x":[0.16],"y":[1]},"o":{"x":[0.84],"y":[0]},"n":["0p16_1_0p84_0"],"t":15,"s":[0],"e":[0]},{"i":{"x":[0.16],"y":[1]},"o":{"x":[0.84],"y":[0]},"n":["0p16_1_0p84_0"],"t":30,"s":[0],"e":[100]},{"t":44}],"ix":1},"e":{"a":0,"k":100,"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":0,"op":45,"st":0,"bm":0}],"markers":[]} ================================================ FILE: mobile/src/main/assets/anim/7.json ================================================ {"v":"5.4.3","fr":30,"ip":0,"op":45,"w":130,"h":194,"nm":"07","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":".number-7 .lightstroke","cl":"number-7 lightstroke","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[69.5,97,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-65.439,93.625],[-65.439,9.511],[-6.439,-27.364],[-6.439,93.625]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.980392158031,0.823529422283,0.811764717102,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":5,"ix":5},"lc":1,"lj":1,"ml":10,"ml2":{"a":0,"k":10,"ix":8},"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":".lightstroke","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false,"cl":"lightstroke"},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.16],"y":[1]},"o":{"x":[0.84],"y":[0]},"n":["0p16_1_0p84_0"],"t":0,"s":[100],"e":[0]},{"i":{"x":[0.16],"y":[1]},"o":{"x":[0.84],"y":[0]},"n":["0p16_1_0p84_0"],"t":15,"s":[0],"e":[0]},{"i":{"x":[0.16],"y":[1]},"o":{"x":[0.84],"y":[0]},"n":["0p16_1_0p84_0"],"t":30,"s":[0],"e":[100]},{"t":44}],"ix":1},"e":{"a":0,"k":100,"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":0,"op":45,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":".number-7","cl":"number-7","td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[69,97,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,35.346],[0,0],[0,0]],"o":[[0,0],[0,0],[35.346,0]],"v":[[60.061,-31.875],[-3.939,-31.875],[-3.939,32.125]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.898039221764,0.266666680574,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":45,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":".number-7 .darkfill","cl":"number-7 darkfill","tt":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.16,"y":1},"o":{"x":0.84,"y":0},"n":"0p16_1_0p84_0","t":0,"s":[4,97,0],"e":[69,97,0],"to":[10.8333330154419,0,0],"ti":[-10.8333330154419,0,0]},{"i":{"x":0.16,"y":0.16},"o":{"x":0.84,"y":0.84},"n":"0p16_0p16_0p84_0p84","t":15,"s":[69,97,0],"e":[69,97,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.16,"y":1},"o":{"x":0.84,"y":0},"n":"0p16_1_0p84_0","t":30,"s":[69,97,0],"e":[4,97,0],"to":[-10.8333330154419,0,0],"ti":[10.8333330154419,0,0]},{"t":44}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,35.346],[0,0],[0,0]],"o":[[0,0],[0,0],[35.346,0]],"v":[[60.061,-31.875],[-3.939,-31.875],[-3.939,32.125]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.898039221764,0.266666680574,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":".darkfill","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false,"cl":"darkfill"}],"ip":0,"op":45,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":".number-7","cl":"number-7","td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[69,97,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[60.061,-31.875],[-67.939,-31.875],[-67.939,-95.875],[60.061,-95.875]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.988235294819,0.909803926945,0.901960790157,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":45,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":".number-7 .lightfill","cl":"number-7 lightfill","tt":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.16,"y":1},"o":{"x":0.84,"y":0},"n":"0p16_1_0p84_0","t":0,"s":[200,97,0],"e":[69,97,0],"to":[-21.8333339691162,0,0],"ti":[21.8333339691162,0,0]},{"i":{"x":0.16,"y":0.16},"o":{"x":0.84,"y":0.84},"n":"0p16_0p16_0p84_0p84","t":15,"s":[69,97,0],"e":[69,97,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.16,"y":1},"o":{"x":0.84,"y":0},"n":"0p16_1_0p84_0","t":30,"s":[69,97,0],"e":[200,97,0],"to":[21.8333339691162,0,0],"ti":[-21.8333339691162,0,0]},{"t":44}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[60.061,-31.875],[-67.939,-31.875],[-67.939,-95.875],[60.061,-95.875]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.988235294819,0.909803926945,0.901960790157,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":".lightfill","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false,"cl":"lightfill"}],"ip":0,"op":45,"st":0,"bm":0}],"markers":[]} ================================================ FILE: mobile/src/main/assets/anim/8.json ================================================ {"v":"5.4.3","fr":30,"ip":0,"op":45,"w":130,"h":195,"nm":"08","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":".number-8","cl":"number-8","td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[69,97.5,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-35.346,0],[0,35.346],[0,0]],"o":[[35.346,0],[0,0],[0,35.346]],"v":[[-3.939,94.875],[60.061,30.875],[-67.939,30.875]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.258823543787,0.521568655968,0.956862747669,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":45,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":".number-8 .darkfill","cl":"number-8 darkfill","tt":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.16,"y":1},"o":{"x":0.84,"y":0},"n":"0p16_1_0p84_0","t":0,"s":[69,31.5,0],"e":[69,97.5,0],"to":[0,11,0],"ti":[0,-11,0]},{"i":{"x":0.16,"y":0.16},"o":{"x":0.84,"y":0.84},"n":"0p16_0p16_0p84_0p84","t":15,"s":[69,97.5,0],"e":[69,97.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.16,"y":1},"o":{"x":0.84,"y":0},"n":"0p16_1_0p84_0","t":30,"s":[69,97.5,0],"e":[69,31.5,0],"to":[0,-11,0],"ti":[0,11,0]},{"t":44}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-35.346,0],[0,35.346],[0,0]],"o":[[35.346,0],[0,0],[0,35.346]],"v":[[-3.939,94.875],[60.061,30.875],[-67.939,30.875]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.258823543787,0.521568655968,0.956862747669,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":".darkfill","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false,"cl":"darkfill"}],"ip":0,"op":45,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":".number-8 .darkstroke","cl":"number-8 darkstroke","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[69,97.5,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-33.073,0],[-1.317,-32.755]],"o":[[1.317,-32.755],[33.073,0],[0,0]],"v":[[-65.389,28.375],[-3.939,-30.625],[57.51,28.375]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.68235296011,0.796078443527,0.96862745285,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":5,"ix":5},"lc":1,"lj":1,"ml":10,"ml2":{"a":0,"k":10,"ix":8},"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":".lightstroke","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false,"cl":"lightstroke"},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.16],"y":[1]},"o":{"x":[0.84],"y":[0]},"n":["0p16_1_0p84_0"],"t":0,"s":[100],"e":[0]},{"i":{"x":[0.16],"y":[1]},"o":{"x":[0.84],"y":[0]},"n":["0p16_1_0p84_0"],"t":15,"s":[0],"e":[0]},{"i":{"x":[0.16],"y":[1]},"o":{"x":[0.84],"y":[0]},"n":["0p16_1_0p84_0"],"t":30,"s":[0],"e":[100]},{"t":44}],"ix":1},"e":{"a":0,"k":100,"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":0,"op":45,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":".number-8","cl":"number-8","td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[69,97.5,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[35.346,0],[0,-35.346],[0,0]],"o":[[-35.346,0],[0,0],[0,-35.346]],"v":[[-3.939,-97.125],[-67.939,-33.125],[60.061,-33.125]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.823529422283,0.890196084976,0.988235294819,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":45,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":".number-8 .lightfill","cl":"number-8 lightfill","tt":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.16,"y":1},"o":{"x":0.84,"y":0},"n":"0p16_1_0p84_0","t":0,"s":[69,167.5,0],"e":[69,97.5,0],"to":[0,-11.6666669845581,0],"ti":[0,11.6666669845581,0]},{"i":{"x":0.16,"y":0.16},"o":{"x":0.84,"y":0.84},"n":"0p16_0p16_0p84_0p84","t":15,"s":[69,97.5,0],"e":[69,97.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.16,"y":1},"o":{"x":0.84,"y":0},"n":"0p16_1_0p84_0","t":30,"s":[69,97.5,0],"e":[69,167.5,0],"to":[0,11.6666669845581,0],"ti":[0,-11.6666669845581,0]},{"t":44}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[35.346,0],[0,-35.346],[0,0]],"o":[[-35.346,0],[0,0],[0,-35.346]],"v":[[-3.939,-97.125],[-67.939,-33.125],[60.061,-33.125]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.823529422283,0.890196084976,0.988235294819,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":".lightfill","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false,"cl":"lightfill"}],"ip":0,"op":45,"st":0,"bm":0}],"markers":[]} ================================================ FILE: mobile/src/main/assets/anim/9.json ================================================ {"v":"5.4.3","fr":30,"ip":0,"op":45,"w":130,"h":195,"nm":"09","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":".number-9 .lightstroke","cl":"number-9 lightstroke","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[68.5,97.5,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-1.939,93.625],[-1.939,-91.364],[57.061,-54.489],[57.061,93.625]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.992156863213,0.929411768913,0.772549033165,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"lc":1,"lj":1,"ml":10,"ml2":{"a":0,"k":10,"ix":8},"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":".lightstroke","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false,"cl":"lightstroke"},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.16],"y":[1]},"o":{"x":[0.84],"y":[0]},"n":["0p16_1_0p84_0"],"t":0,"s":[100],"e":[0]},{"i":{"x":[0.16],"y":[1]},"o":{"x":[0.84],"y":[0]},"n":["0p16_1_0p84_0"],"t":15,"s":[0],"e":[0]},{"i":{"x":[0.16],"y":[1]},"o":{"x":[0.84],"y":[0]},"n":["0p16_1_0p84_0"],"t":30,"s":[0],"e":[100]},{"t":44}],"ix":1},"e":{"a":0,"k":100,"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":0,"op":45,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":".number-9","cl":"number-9","td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[69.5,97.5,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-35.346],[-35.346,0],[0,0]],"o":[[0,35.346],[0,0],[-35.346,0]],"v":[[-68.44,-31.875],[-4.44,32.125],[-4.44,-95.875]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.972549021244,0.721568644047,0.223529413342,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":45,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":".number-9 .darkfill","cl":"number-9 darkfill","tt":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.16,"y":1},"o":{"x":0.84,"y":0},"n":"0p16_1_0p84_0","t":0,"s":[138.5,97.5,0],"e":[68.5,97.5,0],"to":[-11.6666669845581,0,0],"ti":[11.6666669845581,0,0]},{"i":{"x":0.16,"y":0.16},"o":{"x":0.84,"y":0.84},"n":"0p16_0p16_0p84_0p84","t":15,"s":[68.5,97.5,0],"e":[68.5,97.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.16,"y":1},"o":{"x":0.84,"y":0},"n":"0p16_1_0p84_0","t":30,"s":[68.5,97.5,0],"e":[138.5,97.5,0],"to":[11.6666669845581,0,0],"ti":[-11.6666669845581,0,0]},{"t":44}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-35.346],[-35.346,0],[0,0]],"o":[[0,35.346],[0,0],[-35.346,0]],"v":[[-68.44,-31.875],[-4.44,32.125],[-4.44,-95.875]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.972549021244,0.721568644047,0.223529413342,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":".darkfill","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false,"cl":"darkfill"}],"ip":0,"op":45,"st":0,"bm":0}],"markers":[]} ================================================ FILE: mobile/src/main/assets/licenses.html ================================================ Open source licenses

Notice for packages:

================================================ FILE: mobile/src/main/baseline-prof.txt ================================================ HPLandroidx/activity/result/ActivityResultRegistry;->registerKey(Ljava/lang/String;)I HPLandroidx/appcompat/R$id$$IA$1;->m(Ljava/lang/String;II)I HPLandroidx/appcompat/R$id$$IA$1;->m(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; HPLandroidx/appcompat/app/AppCompatActivity;->getResources()Landroid/content/res/Resources; HPLandroidx/appcompat/app/AppCompatDelegateImpl;->onCreateView(Landroid/view/View;Ljava/lang/String;Landroid/content/Context;Landroid/util/AttributeSet;)Landroid/view/View; HPLandroidx/appcompat/view/ContextThemeWrapper;->getSystemService(Ljava/lang/String;)Ljava/lang/Object; HPLandroidx/appcompat/view/SupportMenuInflater$MenuState;->setItem(Landroid/view/MenuItem;)V HPLandroidx/appcompat/view/SupportMenuInflater;->parseMenu(Lorg/xmlpull/v1/XmlPullParser;Landroid/util/AttributeSet;Landroid/view/Menu;)V HPLandroidx/appcompat/view/menu/ActionMenuItemView;->initialize(Landroidx/appcompat/view/menu/MenuItemImpl;I)V HPLandroidx/appcompat/view/menu/ActionMenuItemView;->onMeasure(II)V HPLandroidx/appcompat/view/menu/ActionMenuItemView;->updateTextButtonVisibility()V HPLandroidx/appcompat/view/menu/MenuBuilder;->getVisibleItems()Ljava/util/ArrayList; HPLandroidx/appcompat/view/menu/MenuBuilder;->hasVisibleItems()Z HPLandroidx/appcompat/view/menu/MenuBuilder;->onItemsChanged(Z)V HPLandroidx/appcompat/view/menu/MenuBuilder;->size()I HPLandroidx/appcompat/view/menu/MenuBuilder;->stopDispatchingItemsChanged()V HPLandroidx/appcompat/view/menu/MenuItemImpl;->isVisible()Z HPLandroidx/appcompat/widget/ActionMenuPresenter;->getItemView(Landroidx/appcompat/view/menu/MenuItemImpl;Landroid/view/View;Landroid/view/ViewGroup;)Landroid/view/View; HPLandroidx/appcompat/widget/ActionMenuPresenter;->updateMenuView(Z)V HPLandroidx/appcompat/widget/ActionMenuView;->onMeasure(II)V HPLandroidx/appcompat/widget/AppCompatBackgroundHelper;->(Landroid/view/View;)V HPLandroidx/appcompat/widget/AppCompatBackgroundHelper;->applySupportBackgroundTint()V HPLandroidx/appcompat/widget/AppCompatBackgroundHelper;->loadFromAttributes(Landroid/util/AttributeSet;I)V HPLandroidx/appcompat/widget/AppCompatDrawableManager;->get()Landroidx/appcompat/widget/AppCompatDrawableManager; HPLandroidx/appcompat/widget/AppCompatDrawableManager;->tintDrawable(Landroid/graphics/drawable/Drawable;Lokhttp3/ConnectionSpec$Builder;[I)V HPLandroidx/appcompat/widget/AppCompatImageButton;->(Landroid/content/Context;Landroid/util/AttributeSet;I)V HPLandroidx/appcompat/widget/AppCompatImageButton;->drawableStateChanged()V HPLandroidx/appcompat/widget/AppCompatImageButton;->hasOverlappingRendering()Z HPLandroidx/appcompat/widget/AppCompatImageView;->(Landroid/content/Context;Landroid/util/AttributeSet;I)V HPLandroidx/appcompat/widget/AppCompatImageView;->drawableStateChanged()V HPLandroidx/appcompat/widget/AppCompatImageView;->hasOverlappingRendering()Z HPLandroidx/appcompat/widget/AppCompatTextClassifierHelper;->(Landroid/widget/TextView;)V HPLandroidx/appcompat/widget/AppCompatTextHelper$1;->(Landroidx/appcompat/widget/AppCompatTextHelper;IILjava/lang/ref/WeakReference;)V HPLandroidx/appcompat/widget/AppCompatTextHelper;->(Landroid/widget/TextView;)V HPLandroidx/appcompat/widget/AppCompatTextHelper;->applyCompoundDrawablesTints()V HPLandroidx/appcompat/widget/AppCompatTextHelper;->loadFromAttributes(Landroid/util/AttributeSet;I)V HPLandroidx/appcompat/widget/AppCompatTextHelper;->onSetTextAppearance(Landroid/content/Context;I)V HPLandroidx/appcompat/widget/AppCompatTextHelper;->updateTypefaceAndStyle(Landroid/content/Context;Lcom/google/firebase/iid/zzk;)V HPLandroidx/appcompat/widget/AppCompatTextView;->(Landroid/content/Context;Landroid/util/AttributeSet;I)V HPLandroidx/appcompat/widget/AppCompatTextView;->consumeTextFutureAndSetBlocking()V HPLandroidx/appcompat/widget/AppCompatTextView;->drawableStateChanged()V HPLandroidx/appcompat/widget/AppCompatTextView;->getText()Ljava/lang/CharSequence; HPLandroidx/appcompat/widget/AppCompatTextView;->onLayout(ZIIII)V HPLandroidx/appcompat/widget/AppCompatTextView;->onMeasure(II)V HPLandroidx/appcompat/widget/AppCompatTextView;->onTextChanged(Ljava/lang/CharSequence;III)V HPLandroidx/appcompat/widget/AppCompatTextView;->setCompoundDrawables(Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;)V HPLandroidx/appcompat/widget/AppCompatTextView;->setCompoundDrawablesWithIntrinsicBounds(Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;)V HPLandroidx/appcompat/widget/AppCompatTextView;->setTypeface(Landroid/graphics/Typeface;I)V HPLandroidx/appcompat/widget/AppCompatTextViewAutoSizeHelper;->(Landroid/widget/TextView;)V HPLandroidx/appcompat/widget/AppCompatTextViewAutoSizeHelper;->supportsAutoSizeText()Z HPLandroidx/appcompat/widget/ContentFrameLayout;->onMeasure(II)V HPLandroidx/appcompat/widget/LinearLayoutCompat;->hasDividerBeforeChildAt(I)Z HPLandroidx/appcompat/widget/LinearLayoutCompat;->onLayout(ZIIII)V HPLandroidx/appcompat/widget/LinearLayoutCompat;->onMeasure(II)V HPLandroidx/appcompat/widget/ResourceManagerInternal;->createDrawableIfNeeded(Landroid/content/Context;I)Landroid/graphics/drawable/Drawable; HPLandroidx/appcompat/widget/ResourceManagerInternal;->getDrawable(Landroid/content/Context;IZ)Landroid/graphics/drawable/Drawable; HPLandroidx/appcompat/widget/ResourceManagerInternal;->getTintList(Landroid/content/Context;I)Landroid/content/res/ColorStateList; HPLandroidx/appcompat/widget/ResourceManagerInternal;->tintDrawableUsingColorFilter(Landroid/content/Context;ILandroid/graphics/drawable/Drawable;)Z HPLandroidx/appcompat/widget/ThemeUtils;->checkAppCompatTheme(Landroid/view/View;Landroid/content/Context;)V HPLandroidx/appcompat/widget/TintContextWrapper;->wrap(Landroid/content/Context;)Landroid/content/Context; HPLandroidx/appcompat/widget/Toolbar;->addCustomViewsWithGravity(Ljava/util/List;I)V HPLandroidx/appcompat/widget/Toolbar;->getChildHorizontalGravity(I)I HPLandroidx/appcompat/widget/Toolbar;->getChildTop(Landroid/view/View;I)I HPLandroidx/appcompat/widget/Toolbar;->getContentInsetEnd()I HPLandroidx/appcompat/widget/Toolbar;->getContentInsetStart()I HPLandroidx/appcompat/widget/Toolbar;->getCurrentContentInsetEnd()I HPLandroidx/appcompat/widget/Toolbar;->getCurrentContentInsetStart()I HPLandroidx/appcompat/widget/Toolbar;->getHorizontalMargins(Landroid/view/View;)I HPLandroidx/appcompat/widget/Toolbar;->getNavigationIcon()Landroid/graphics/drawable/Drawable; HPLandroidx/appcompat/widget/Toolbar;->getVerticalMargins(Landroid/view/View;)I HPLandroidx/appcompat/widget/Toolbar;->layoutChildLeft(Landroid/view/View;I[II)I HPLandroidx/appcompat/widget/Toolbar;->layoutChildRight(Landroid/view/View;I[II)I HPLandroidx/appcompat/widget/Toolbar;->measureChildCollapseMargins(Landroid/view/View;IIII[I)I HPLandroidx/appcompat/widget/Toolbar;->measureChildConstrained(Landroid/view/View;IIIII)V HPLandroidx/appcompat/widget/Toolbar;->onLayout(ZIIII)V HPLandroidx/appcompat/widget/Toolbar;->onMeasure(II)V HPLandroidx/appcompat/widget/Toolbar;->shouldLayout(Landroid/view/View;)Z HPLandroidx/appcompat/widget/ViewUtils;->isLayoutRtl(Landroid/view/View;)Z HPLandroidx/arch/core/executor/ArchTaskExecutor;->getInstance()Landroidx/arch/core/executor/ArchTaskExecutor; HPLandroidx/arch/core/executor/ArchTaskExecutor;->isMainThread()Z HPLandroidx/arch/core/executor/DefaultTaskExecutor;->isMainThread()Z HPLandroidx/arch/core/internal/FastSafeIterableMap;->contains(Ljava/lang/Object;)Z HPLandroidx/arch/core/internal/FastSafeIterableMap;->get(Ljava/lang/Object;)Landroidx/arch/core/internal/SafeIterableMap$Entry; HPLandroidx/arch/core/internal/FastSafeIterableMap;->putIfAbsent(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/arch/core/internal/FastSafeIterableMap;->remove(Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/arch/core/internal/SafeIterableMap$Entry;->(Ljava/lang/Object;Ljava/lang/Object;)V HPLandroidx/arch/core/internal/SafeIterableMap$Entry;->getValue()Ljava/lang/Object; HPLandroidx/arch/core/internal/SafeIterableMap$IteratorWithAdditions;->(Landroidx/arch/core/internal/SafeIterableMap;)V HPLandroidx/arch/core/internal/SafeIterableMap$IteratorWithAdditions;->hasNext()Z HPLandroidx/arch/core/internal/SafeIterableMap$IteratorWithAdditions;->next()Ljava/lang/Object; HPLandroidx/arch/core/internal/SafeIterableMap$ListIterator;->next()Ljava/lang/Object; HPLandroidx/arch/core/internal/SafeIterableMap$ListIterator;->nextNode()Landroidx/arch/core/internal/SafeIterableMap$Entry; HPLandroidx/arch/core/internal/SafeIterableMap$ListIterator;->supportRemove(Landroidx/arch/core/internal/SafeIterableMap$Entry;)V HPLandroidx/arch/core/internal/SafeIterableMap;->()V HPLandroidx/arch/core/internal/SafeIterableMap;->iteratorWithAdditions()Landroidx/arch/core/internal/SafeIterableMap$IteratorWithAdditions; HPLandroidx/arch/core/internal/SafeIterableMap;->put(Ljava/lang/Object;Ljava/lang/Object;)Landroidx/arch/core/internal/SafeIterableMap$Entry; HPLandroidx/arch/core/internal/SafeIterableMap;->remove(Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/collection/LongSparseArray;->(I)V HPLandroidx/collection/LongSparseArray;->clear()V HPLandroidx/collection/LongSparseArray;->size()I HPLandroidx/collection/LruCache;->get(Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/collection/SimpleArrayMap;->()V HPLandroidx/collection/SimpleArrayMap;->allocArrays(I)V HPLandroidx/collection/SimpleArrayMap;->clear()V HPLandroidx/collection/SimpleArrayMap;->freeArrays([I[Ljava/lang/Object;I)V HPLandroidx/collection/SimpleArrayMap;->getOrDefault(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/collection/SimpleArrayMap;->indexOf(Ljava/lang/Object;I)I HPLandroidx/collection/SimpleArrayMap;->indexOfKey(Ljava/lang/Object;)I HPLandroidx/collection/SimpleArrayMap;->keyAt(I)Ljava/lang/Object; HPLandroidx/collection/SimpleArrayMap;->put(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/collection/SimpleArrayMap;->remove(Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/collection/SimpleArrayMap;->removeAt(I)Ljava/lang/Object; HPLandroidx/collection/SimpleArrayMap;->valueAt(I)Ljava/lang/Object; HPLandroidx/collection/SparseArrayCompat;->valueAt(I)Ljava/lang/Object; HPLandroidx/compose/animation/core/AnimationEndReason$EnumUnboxingSharedUtility;->ordinal(I)I HPLandroidx/compose/material/ScaffoldKt$Scaffold$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/material/SwipeableState$special$$inlined$filter$1$2;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HPLandroidx/compose/runtime/Latch$await$2$2;->invoke()V HPLandroidx/compose/runtime/SnapshotThreadLocal;->dayForPosition(I)Lcom/google/samples/apps/iosched/model/ConferenceDay; HPLandroidx/compose/runtime/SnapshotThreadLocal;->insertOrUpdatePersistedInstallationEntry(Lcom/google/firebase/installations/local/AutoValue_PersistedInstallationEntry;)Lcom/google/firebase/installations/local/AutoValue_PersistedInstallationEntry; HPLandroidx/compose/runtime/SnapshotThreadLocal;->readJSONFromFile()Lorg/json/JSONObject; HPLandroidx/compose/runtime/SnapshotThreadLocal;->readPersistedInstallationEntryValue()Lcom/google/firebase/installations/local/AutoValue_PersistedInstallationEntry; HPLandroidx/compose/runtime/Stack;->zza(ILjava/lang/Object;Lcom/google/android/gms/internal/measurement/zzhf;)V HPLandroidx/constraintlayout/solver/ArrayLinkedVariables;->(Landroidx/constraintlayout/solver/ArrayRow;Lcom/google/firebase/iid/zzaw;)V HPLandroidx/constraintlayout/solver/ArrayRow;->()V HPLandroidx/constraintlayout/solver/ArrayRow;->(Lcom/google/firebase/iid/zzaw;)V HPLandroidx/constraintlayout/solver/ArrayRow;->addError(Landroidx/constraintlayout/solver/LinearSystem;I)Landroidx/constraintlayout/solver/ArrayRow; HPLandroidx/constraintlayout/solver/ArrayRow;->createRowGreaterThan(Landroidx/constraintlayout/solver/SolverVariable;Landroidx/constraintlayout/solver/SolverVariable;Landroidx/constraintlayout/solver/SolverVariable;I)Landroidx/constraintlayout/solver/ArrayRow; HPLandroidx/constraintlayout/solver/ArrayRow;->createRowLowerThan(Landroidx/constraintlayout/solver/SolverVariable;Landroidx/constraintlayout/solver/SolverVariable;Landroidx/constraintlayout/solver/SolverVariable;I)Landroidx/constraintlayout/solver/ArrayRow; HPLandroidx/constraintlayout/solver/ArrayRow;->isNew(Landroidx/constraintlayout/solver/SolverVariable;)Z HPLandroidx/constraintlayout/solver/ArrayRow;->pivot(Landroidx/constraintlayout/solver/SolverVariable;)V HPLandroidx/constraintlayout/solver/ArrayRow;->updateFromFinalVariable(Landroidx/constraintlayout/solver/SolverVariable;Z)V HPLandroidx/constraintlayout/solver/ArrayRow;->updateFromRow(Landroidx/constraintlayout/solver/ArrayRow;Z)V HPLandroidx/constraintlayout/solver/LinearSystem$ValuesRow;->(Landroidx/constraintlayout/solver/LinearSystem;Lcom/google/firebase/iid/zzaw;)V HPLandroidx/constraintlayout/solver/LinearSystem;->()V HPLandroidx/constraintlayout/solver/LinearSystem;->acquireSolverVariable$enumunboxing$(ILjava/lang/String;)Landroidx/constraintlayout/solver/SolverVariable; HPLandroidx/constraintlayout/solver/LinearSystem;->addCentering(Landroidx/constraintlayout/solver/SolverVariable;Landroidx/constraintlayout/solver/SolverVariable;IFLandroidx/constraintlayout/solver/SolverVariable;Landroidx/constraintlayout/solver/SolverVariable;II)V HPLandroidx/constraintlayout/solver/LinearSystem;->addConstraint(Landroidx/constraintlayout/solver/ArrayRow;)V HPLandroidx/constraintlayout/solver/LinearSystem;->addEquality(Landroidx/constraintlayout/solver/SolverVariable;I)V HPLandroidx/constraintlayout/solver/LinearSystem;->addEquality(Landroidx/constraintlayout/solver/SolverVariable;Landroidx/constraintlayout/solver/SolverVariable;II)Landroidx/constraintlayout/solver/ArrayRow; HPLandroidx/constraintlayout/solver/LinearSystem;->addGreaterThan(Landroidx/constraintlayout/solver/SolverVariable;Landroidx/constraintlayout/solver/SolverVariable;II)V HPLandroidx/constraintlayout/solver/LinearSystem;->addLowerThan(Landroidx/constraintlayout/solver/SolverVariable;Landroidx/constraintlayout/solver/SolverVariable;II)V HPLandroidx/constraintlayout/solver/LinearSystem;->addRow(Landroidx/constraintlayout/solver/ArrayRow;)V HPLandroidx/constraintlayout/solver/LinearSystem;->computeValues()V HPLandroidx/constraintlayout/solver/LinearSystem;->createErrorVariable(ILjava/lang/String;)Landroidx/constraintlayout/solver/SolverVariable; HPLandroidx/constraintlayout/solver/LinearSystem;->createObjectVariable(Ljava/lang/Object;)Landroidx/constraintlayout/solver/SolverVariable; HPLandroidx/constraintlayout/solver/LinearSystem;->createRow()Landroidx/constraintlayout/solver/ArrayRow; HPLandroidx/constraintlayout/solver/LinearSystem;->createSlackVariable()Landroidx/constraintlayout/solver/SolverVariable; HPLandroidx/constraintlayout/solver/LinearSystem;->getObjectVariableValue(Ljava/lang/Object;)I HPLandroidx/constraintlayout/solver/LinearSystem;->increaseTableSize()V HPLandroidx/constraintlayout/solver/LinearSystem;->minimizeGoal(Landroidx/constraintlayout/solver/ArrayRow;)V HPLandroidx/constraintlayout/solver/LinearSystem;->optimize(Landroidx/constraintlayout/solver/ArrayRow;)I HPLandroidx/constraintlayout/solver/LinearSystem;->releaseRows()V HPLandroidx/constraintlayout/solver/LinearSystem;->reset()V HPLandroidx/constraintlayout/solver/PriorityGoalRow;->(Lcom/google/firebase/iid/zzaw;)V HPLandroidx/constraintlayout/solver/PriorityGoalRow;->addError(Landroidx/constraintlayout/solver/SolverVariable;)V HPLandroidx/constraintlayout/solver/PriorityGoalRow;->addToGoal(Landroidx/constraintlayout/solver/SolverVariable;)V HPLandroidx/constraintlayout/solver/PriorityGoalRow;->clear()V HPLandroidx/constraintlayout/solver/PriorityGoalRow;->getPivotCandidate(Landroidx/constraintlayout/solver/LinearSystem;[Z)Landroidx/constraintlayout/solver/SolverVariable; HPLandroidx/constraintlayout/solver/PriorityGoalRow;->removeGoal(Landroidx/constraintlayout/solver/SolverVariable;)V HPLandroidx/constraintlayout/solver/PriorityGoalRow;->updateFromRow(Landroidx/constraintlayout/solver/ArrayRow;Z)V HPLandroidx/constraintlayout/solver/SolverVariable;->(I)V HPLandroidx/constraintlayout/solver/SolverVariable;->addToRow(Landroidx/constraintlayout/solver/ArrayRow;)V HPLandroidx/constraintlayout/solver/SolverVariable;->removeFromRow(Landroidx/constraintlayout/solver/ArrayRow;)V HPLandroidx/constraintlayout/solver/SolverVariable;->reset()V HPLandroidx/constraintlayout/solver/SolverVariable;->setFinalValue(Landroidx/constraintlayout/solver/LinearSystem;F)V HPLandroidx/constraintlayout/solver/SolverVariable;->updateReferencesWithNewDefinition(Landroidx/constraintlayout/solver/ArrayRow;)V HPLandroidx/constraintlayout/solver/SolverVariableValues;->(Landroidx/constraintlayout/solver/ArrayRow;Lcom/google/firebase/iid/zzaw;)V HPLandroidx/constraintlayout/solver/SolverVariableValues;->add(Landroidx/constraintlayout/solver/SolverVariable;FZ)V HPLandroidx/constraintlayout/solver/SolverVariableValues;->addToHashMap(Landroidx/constraintlayout/solver/SolverVariable;I)V HPLandroidx/constraintlayout/solver/SolverVariableValues;->addVariable(ILandroidx/constraintlayout/solver/SolverVariable;F)V HPLandroidx/constraintlayout/solver/SolverVariableValues;->clear()V HPLandroidx/constraintlayout/solver/SolverVariableValues;->contains(Landroidx/constraintlayout/solver/SolverVariable;)Z HPLandroidx/constraintlayout/solver/SolverVariableValues;->divideByAmount(F)V HPLandroidx/constraintlayout/solver/SolverVariableValues;->get(Landroidx/constraintlayout/solver/SolverVariable;)F HPLandroidx/constraintlayout/solver/SolverVariableValues;->getCurrentSize()I HPLandroidx/constraintlayout/solver/SolverVariableValues;->getVariable(I)Landroidx/constraintlayout/solver/SolverVariable; HPLandroidx/constraintlayout/solver/SolverVariableValues;->getVariableValue(I)F HPLandroidx/constraintlayout/solver/SolverVariableValues;->indexOf(Landroidx/constraintlayout/solver/SolverVariable;)I HPLandroidx/constraintlayout/solver/SolverVariableValues;->invert()V HPLandroidx/constraintlayout/solver/SolverVariableValues;->put(Landroidx/constraintlayout/solver/SolverVariable;F)V HPLandroidx/constraintlayout/solver/SolverVariableValues;->remove(Landroidx/constraintlayout/solver/SolverVariable;Z)F HPLandroidx/constraintlayout/solver/SolverVariableValues;->use(Landroidx/constraintlayout/solver/ArrayRow;Z)F HPLandroidx/constraintlayout/solver/widgets/Barrier;->addToSolver(Landroidx/constraintlayout/solver/LinearSystem;)V HPLandroidx/constraintlayout/solver/widgets/ChainHead;->(Landroidx/constraintlayout/solver/widgets/ConstraintWidget;IZ)V HPLandroidx/constraintlayout/solver/widgets/ConstraintAnchor;->(Landroidx/constraintlayout/solver/widgets/ConstraintWidget;Landroidx/constraintlayout/solver/widgets/ConstraintAnchor$Type;)V HPLandroidx/constraintlayout/solver/widgets/ConstraintAnchor;->connect(Landroidx/constraintlayout/solver/widgets/ConstraintAnchor;IIZ)Z HPLandroidx/constraintlayout/solver/widgets/ConstraintAnchor;->getMargin()I HPLandroidx/constraintlayout/solver/widgets/ConstraintAnchor;->hasCenteredDependents()Z HPLandroidx/constraintlayout/solver/widgets/ConstraintAnchor;->isConnected()Z HPLandroidx/constraintlayout/solver/widgets/ConstraintAnchor;->reset()V HPLandroidx/constraintlayout/solver/widgets/ConstraintAnchor;->resetSolverVariable()V HPLandroidx/constraintlayout/solver/widgets/ConstraintWidget;->()V HPLandroidx/constraintlayout/solver/widgets/ConstraintWidget;->addToSolver(Landroidx/constraintlayout/solver/LinearSystem;)V HPLandroidx/constraintlayout/solver/widgets/ConstraintWidget;->applyConstraints$enumunboxing$(Landroidx/constraintlayout/solver/LinearSystem;ZZZZLandroidx/constraintlayout/solver/SolverVariable;Landroidx/constraintlayout/solver/SolverVariable;IZLandroidx/constraintlayout/solver/widgets/ConstraintAnchor;Landroidx/constraintlayout/solver/widgets/ConstraintAnchor;IIIIFZZZZIIIIFZ)V HPLandroidx/constraintlayout/solver/widgets/ConstraintWidget;->createObjectVariables(Landroidx/constraintlayout/solver/LinearSystem;)V HPLandroidx/constraintlayout/solver/widgets/ConstraintWidget;->getAnchor(Landroidx/constraintlayout/solver/widgets/ConstraintAnchor$Type;)Landroidx/constraintlayout/solver/widgets/ConstraintAnchor; HPLandroidx/constraintlayout/solver/widgets/ConstraintWidget;->getDimensionBehaviour$enumunboxing$(I)I HPLandroidx/constraintlayout/solver/widgets/ConstraintWidget;->getHeight()I HPLandroidx/constraintlayout/solver/widgets/ConstraintWidget;->getHorizontalDimensionBehaviour$enumunboxing$()I HPLandroidx/constraintlayout/solver/widgets/ConstraintWidget;->getVerticalDimensionBehaviour$enumunboxing$()I HPLandroidx/constraintlayout/solver/widgets/ConstraintWidget;->getWidth()I HPLandroidx/constraintlayout/solver/widgets/ConstraintWidget;->getX()I HPLandroidx/constraintlayout/solver/widgets/ConstraintWidget;->getY()I HPLandroidx/constraintlayout/solver/widgets/ConstraintWidget;->isChainHead(I)Z HPLandroidx/constraintlayout/solver/widgets/ConstraintWidget;->isInHorizontalChain()Z HPLandroidx/constraintlayout/solver/widgets/ConstraintWidget;->isInVerticalChain()Z HPLandroidx/constraintlayout/solver/widgets/ConstraintWidget;->reset()V HPLandroidx/constraintlayout/solver/widgets/ConstraintWidget;->resetSolverVariables(Lcom/google/firebase/iid/zzaw;)V HPLandroidx/constraintlayout/solver/widgets/ConstraintWidget;->setHeight(I)V HPLandroidx/constraintlayout/solver/widgets/ConstraintWidget;->setMinHeight(I)V HPLandroidx/constraintlayout/solver/widgets/ConstraintWidget;->setMinWidth(I)V HPLandroidx/constraintlayout/solver/widgets/ConstraintWidget;->setWidth(I)V HPLandroidx/constraintlayout/solver/widgets/ConstraintWidget;->updateFromSolver(Landroidx/constraintlayout/solver/LinearSystem;)V HPLandroidx/constraintlayout/solver/widgets/ConstraintWidgetContainer;->()V HPLandroidx/constraintlayout/solver/widgets/ConstraintWidgetContainer;->addChain(Landroidx/constraintlayout/solver/widgets/ConstraintWidget;I)V HPLandroidx/constraintlayout/solver/widgets/ConstraintWidgetContainer;->addChildrenToSolver(Landroidx/constraintlayout/solver/LinearSystem;)Z HPLandroidx/constraintlayout/solver/widgets/ConstraintWidgetContainer;->invalidateGraph()V HPLandroidx/constraintlayout/solver/widgets/ConstraintWidgetContainer;->layout()V HPLandroidx/constraintlayout/solver/widgets/ConstraintWidgetContainer;->resetSolverVariables(Lcom/google/firebase/iid/zzaw;)V HPLandroidx/constraintlayout/solver/widgets/ConstraintWidgetContainer;->setOptimizationLevel(I)V HPLandroidx/constraintlayout/solver/widgets/Guideline;->()V HPLandroidx/constraintlayout/solver/widgets/Guideline;->addToSolver(Landroidx/constraintlayout/solver/LinearSystem;)V HPLandroidx/constraintlayout/solver/widgets/Guideline;->getAnchor(Landroidx/constraintlayout/solver/widgets/ConstraintAnchor$Type;)Landroidx/constraintlayout/solver/widgets/ConstraintAnchor; HPLandroidx/constraintlayout/solver/widgets/Guideline;->setOrientation(I)V HPLandroidx/constraintlayout/solver/widgets/Guideline;->updateFromSolver(Landroidx/constraintlayout/solver/LinearSystem;)V HPLandroidx/constraintlayout/solver/widgets/analyzer/DependencyGraph;->(Landroidx/constraintlayout/solver/widgets/ConstraintWidgetContainer;)V HPLandroidx/constraintlayout/solver/widgets/analyzer/DependencyNode;->(Landroidx/constraintlayout/solver/widgets/analyzer/WidgetRun;)V HPLandroidx/constraintlayout/solver/widgets/analyzer/DimensionDependency;->(Landroidx/constraintlayout/solver/widgets/analyzer/WidgetRun;)V HPLandroidx/constraintlayout/solver/widgets/analyzer/HorizontalWidgetRun;->(Landroidx/constraintlayout/solver/widgets/ConstraintWidget;)V HPLandroidx/constraintlayout/solver/widgets/analyzer/VerticalWidgetRun;->(Landroidx/constraintlayout/solver/widgets/ConstraintWidget;)V HPLandroidx/constraintlayout/solver/widgets/analyzer/WidgetRun;->(Landroidx/constraintlayout/solver/widgets/ConstraintWidget;)V HPLandroidx/constraintlayout/widget/Barrier;->init(Landroid/util/AttributeSet;)V HPLandroidx/constraintlayout/widget/ConstraintHelper;->(Landroid/content/Context;Landroid/util/AttributeSet;)V HPLandroidx/constraintlayout/widget/ConstraintHelper;->addID(Ljava/lang/String;)V HPLandroidx/constraintlayout/widget/ConstraintHelper;->addRscID(I)V HPLandroidx/constraintlayout/widget/ConstraintHelper;->findId(Landroidx/constraintlayout/widget/ConstraintLayout;Ljava/lang/String;)I HPLandroidx/constraintlayout/widget/ConstraintHelper;->onAttachedToWindow()V HPLandroidx/constraintlayout/widget/ConstraintHelper;->setIds(Ljava/lang/String;)V HPLandroidx/constraintlayout/widget/ConstraintHelper;->validateParams()V HPLandroidx/constraintlayout/widget/ConstraintLayout$LayoutParams;->resolveLayoutDirection(I)V HPLandroidx/constraintlayout/widget/ConstraintLayout$LayoutParams;->validate()V HPLandroidx/constraintlayout/widget/ConstraintLayout;->(Landroid/content/Context;Landroid/util/AttributeSet;)V HPLandroidx/constraintlayout/widget/ConstraintLayout;->dispatchDraw(Landroid/graphics/Canvas;)V HPLandroidx/constraintlayout/widget/ConstraintLayout;->generateLayoutParams(Landroid/util/AttributeSet;)Landroid/view/ViewGroup$LayoutParams; HPLandroidx/constraintlayout/widget/ConstraintLayout;->getPaddingWidth()I HPLandroidx/constraintlayout/widget/ConstraintLayout;->getViewWidget(Landroid/view/View;)Landroidx/constraintlayout/solver/widgets/ConstraintWidget; HPLandroidx/constraintlayout/widget/ConstraintLayout;->init(Landroid/util/AttributeSet;II)V HPLandroidx/constraintlayout/widget/ConstraintLayout;->isRtl()Z HPLandroidx/constraintlayout/widget/ConstraintLayout;->onLayout(ZIIII)V HPLandroidx/constraintlayout/widget/ConstraintLayout;->onViewAdded(Landroid/view/View;)V HPLandroidx/constraintlayout/widget/ConstraintLayout;->requestLayout()V HPLandroidx/coordinatorlayout/widget/CoordinatorLayout$LayoutParams;->(Landroid/content/Context;Landroid/util/AttributeSet;)V HPLandroidx/coordinatorlayout/widget/CoordinatorLayout;->acquireTempRect()Landroid/graphics/Rect; HPLandroidx/coordinatorlayout/widget/CoordinatorLayout;->drawChild(Landroid/graphics/Canvas;Landroid/view/View;J)Z HPLandroidx/coordinatorlayout/widget/CoordinatorLayout;->getChildRect(Landroid/view/View;ZLandroid/graphics/Rect;)V HPLandroidx/coordinatorlayout/widget/CoordinatorLayout;->getDependencies(Landroid/view/View;)Ljava/util/List; HPLandroidx/coordinatorlayout/widget/CoordinatorLayout;->getDescendantRect(Landroid/view/View;Landroid/graphics/Rect;)V HPLandroidx/coordinatorlayout/widget/CoordinatorLayout;->getLastWindowInsets()Landroidx/core/view/WindowInsetsCompat; HPLandroidx/coordinatorlayout/widget/CoordinatorLayout;->getResolvedLayoutParams(Landroid/view/View;)Landroidx/coordinatorlayout/widget/CoordinatorLayout$LayoutParams; HPLandroidx/coordinatorlayout/widget/CoordinatorLayout;->getSuggestedMinimumHeight()I HPLandroidx/coordinatorlayout/widget/CoordinatorLayout;->getSuggestedMinimumWidth()I HPLandroidx/coordinatorlayout/widget/CoordinatorLayout;->onChildViewsChanged(I)V HPLandroidx/coordinatorlayout/widget/CoordinatorLayout;->onLayout(ZIIII)V HPLandroidx/coordinatorlayout/widget/CoordinatorLayout;->onLayoutChild(Landroid/view/View;I)V HPLandroidx/coordinatorlayout/widget/CoordinatorLayout;->onMeasure(II)V HPLandroidx/coordinatorlayout/widget/CoordinatorLayout;->onMeasureChild(Landroid/view/View;IIII)V HPLandroidx/coordinatorlayout/widget/CoordinatorLayout;->performIntercept(Landroid/view/MotionEvent;I)Z HPLandroidx/coordinatorlayout/widget/ViewGroupUtils;->offsetDescendantMatrix(Landroid/view/ViewParent;Landroid/view/View;Landroid/graphics/Matrix;)V HPLandroidx/core/R$dimen;->binarySearch([III)I HPLandroidx/core/R$dimen;->getLifecycleScope(Landroidx/lifecycle/LifecycleOwner;)Landroidx/lifecycle/LifecycleCoroutineScopeImpl; HPLandroidx/core/R$dimen;->loadFont(Landroid/content/Context;ILandroid/util/TypedValue;ILcom/google/common/collect/Maps;Landroid/os/Handler;ZZ)Landroid/graphics/Typeface; HPLandroidx/core/R$id;->Channel$default(ILkotlinx/coroutines/channels/BufferOverflow;Lkotlin/jvm/functions/Function1;I)Lkotlinx/coroutines/channels/Channel; HPLandroidx/core/R$id;->applyChainConstraints(Landroidx/constraintlayout/solver/widgets/ConstraintWidgetContainer;Landroidx/constraintlayout/solver/LinearSystem;I)V HPLandroidx/core/R$id;->computeScrollExtent(Landroidx/recyclerview/widget/RecyclerView$State;Landroidx/recyclerview/widget/OrientationHelper;Landroid/view/View;Landroid/view/View;Landroidx/recyclerview/widget/RecyclerView$LayoutManager;Z)I HPLandroidx/core/R$id;->computeScrollOffset(Landroidx/recyclerview/widget/RecyclerView$State;Landroidx/recyclerview/widget/OrientationHelper;Landroid/view/View;Landroid/view/View;Landroidx/recyclerview/widget/RecyclerView$LayoutManager;ZZ)I HPLandroidx/core/R$id;->computeScrollRange(Landroidx/recyclerview/widget/RecyclerView$State;Landroidx/recyclerview/widget/OrientationHelper;Landroid/view/View;Landroid/view/View;Landroidx/recyclerview/widget/RecyclerView$LayoutManager;Z)I HPLandroidx/core/R$id;->configureSharing$FlowKt__ShareKt(Lkotlinx/coroutines/flow/Flow;I)Lcom/google/firebase/iid/zzab; HPLandroidx/core/R$id;->coroutineScope(Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HPLandroidx/core/R$id;->getOrCreateCancellableContinuation(Lkotlin/coroutines/Continuation;)Lkotlinx/coroutines/CancellableContinuationImpl; HPLandroidx/core/R$id;->newStaticLayout(Ljava/lang/CharSequence;Landroid/text/TextPaint;ILandroid/text/Layout$Alignment;FFZ)Landroid/text/StaticLayout; HPLandroidx/core/R$id;->plus(Lkotlin/coroutines/CoroutineContext;Lkotlin/coroutines/CoroutineContext;)Lkotlin/coroutines/CoroutineContext; HPLandroidx/core/graphics/Insets;->(IIII)V HPLandroidx/core/graphics/Insets;->of(IIII)Landroidx/core/graphics/Insets; HPLandroidx/core/graphics/Insets;->toCompatInsets(Landroid/graphics/Insets;)Landroidx/core/graphics/Insets; HPLandroidx/core/graphics/TypefaceCompat;->createFromResourcesFamilyXml(Landroid/content/Context;Landroidx/core/content/res/FontResourcesParserCompat$FamilyResourceEntry;Landroid/content/res/Resources;IILcom/google/common/collect/Maps;Landroid/os/Handler;Z)Landroid/graphics/Typeface; HPLandroidx/core/graphics/TypefaceCompat;->createResourceUid(Landroid/content/res/Resources;II)Ljava/lang/String; HPLandroidx/core/provider/FontRequest;->(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/List;)V HPLandroidx/core/provider/FontRequestWorker$2;->accept(Landroidx/core/provider/FontRequestWorker$TypefaceResult;)V HPLandroidx/core/provider/FontRequestWorker;->createCacheId(Landroidx/core/provider/FontRequest;I)Ljava/lang/String; HPLandroidx/core/util/Pools$SimplePool;->(II)V HPLandroidx/core/util/Pools$SimplePool;->acquire()Ljava/lang/Object; HPLandroidx/core/util/Pools$SimplePool;->release(Ljava/lang/Object;)Z HPLandroidx/core/util/Pools$SynchronizedPool;->acquire()Ljava/lang/Object; HPLandroidx/core/util/Pools$SynchronizedPool;->release(Ljava/lang/Object;)Z HPLandroidx/core/view/AccessibilityDelegateCompat$AccessibilityDelegateAdapter;->(Landroidx/core/view/AccessibilityDelegateCompat;)V HPLandroidx/core/view/AccessibilityDelegateCompat$AccessibilityDelegateAdapter;->getAccessibilityNodeProvider(Landroid/view/View;)Landroid/view/accessibility/AccessibilityNodeProvider; HPLandroidx/core/view/AccessibilityDelegateCompat$AccessibilityDelegateAdapter;->onInitializeAccessibilityEvent(Landroid/view/View;Landroid/view/accessibility/AccessibilityEvent;)V HPLandroidx/core/view/AccessibilityDelegateCompat$AccessibilityDelegateAdapter;->onInitializeAccessibilityNodeInfo(Landroid/view/View;Landroid/view/accessibility/AccessibilityNodeInfo;)V HPLandroidx/core/view/AccessibilityDelegateCompat$AccessibilityDelegateAdapter;->onRequestSendAccessibilityEvent(Landroid/view/ViewGroup;Landroid/view/View;Landroid/view/accessibility/AccessibilityEvent;)Z HPLandroidx/core/view/AccessibilityDelegateCompat$AccessibilityDelegateAdapter;->sendAccessibilityEventUnchecked(Landroid/view/View;Landroid/view/accessibility/AccessibilityEvent;)V HPLandroidx/core/view/AccessibilityDelegateCompat;->()V HPLandroidx/core/view/AccessibilityDelegateCompat;->getAccessibilityNodeProvider(Landroid/view/View;)Landroidx/core/view/PointerIconCompat; HPLandroidx/core/view/AccessibilityDelegateCompat;->sendAccessibilityEventUnchecked(Landroid/view/View;Landroid/view/accessibility/AccessibilityEvent;)V HPLandroidx/core/view/NestedScrollingChildHelper;->dispatchNestedPreScroll(II[I[II)Z HPLandroidx/core/view/NestedScrollingChildHelper;->dispatchNestedScrollInternal(IIII[II[I)Z HPLandroidx/core/view/NestedScrollingChildHelper;->getNestedScrollingParentForType(I)Landroid/view/ViewParent; HPLandroidx/core/view/NestedScrollingChildHelper;->stopNestedScroll(I)V HPLandroidx/core/view/ViewCompat$2;->(ILjava/lang/Class;II)V HPLandroidx/core/view/ViewCompat$2;->(ILjava/lang/Class;III)V HPLandroidx/core/view/ViewCompat$2;->frameworkGet(Landroid/view/View;)Ljava/lang/Boolean; HPLandroidx/core/view/ViewCompat$AccessibilityViewProperty;->(ILjava/lang/Class;I)V HPLandroidx/core/view/ViewCompat$AccessibilityViewProperty;->(ILjava/lang/Class;II)V HPLandroidx/core/view/ViewCompat$AccessibilityViewProperty;->get(Landroid/view/View;)Ljava/lang/Object; HPLandroidx/core/view/ViewCompat$Api23Impl;->getRootWindowInsets(Landroid/view/View;)Landroidx/core/view/WindowInsetsCompat; HPLandroidx/core/view/ViewCompat$Api29Impl;->saveAttributeDataForStyleable(Landroid/view/View;Landroid/content/Context;[ILandroid/util/AttributeSet;Landroid/content/res/TypedArray;II)V HPLandroidx/core/view/ViewCompat;->getAccessibilityDelegate(Landroid/view/View;)Landroidx/core/view/AccessibilityDelegateCompat; HPLandroidx/core/view/ViewCompat;->getAccessibilityDelegateInternal(Landroid/view/View;)Landroid/view/View$AccessibilityDelegate; HPLandroidx/core/view/ViewCompat;->getAccessibilityPaneTitle(Landroid/view/View;)Ljava/lang/CharSequence; HPLandroidx/core/view/ViewCompat;->notifyViewAccessibilityStateChangedIfNeeded(Landroid/view/View;I)V HPLandroidx/core/view/ViewCompat;->saveAttributeDataForStyleable(Landroid/view/View;Landroid/content/Context;[ILandroid/util/AttributeSet;Landroid/content/res/TypedArray;II)V HPLandroidx/core/view/ViewCompat;->setAccessibilityDelegate(Landroid/view/View;Landroidx/core/view/AccessibilityDelegateCompat;)V HPLandroidx/core/view/WindowInsetsCompat$Impl20;->(Landroidx/core/view/WindowInsetsCompat;Landroid/view/WindowInsets;)V HPLandroidx/core/view/WindowInsetsCompat$Impl20;->getSystemWindowInsets()Landroidx/core/graphics/Insets; HPLandroidx/core/view/WindowInsetsCompat$Impl21;->(Landroidx/core/view/WindowInsetsCompat;Landroid/view/WindowInsets;)V HPLandroidx/core/view/WindowInsetsCompat$Impl29;->(Landroidx/core/view/WindowInsetsCompat;Landroid/view/WindowInsets;)V HPLandroidx/core/view/WindowInsetsCompat$Impl29;->getSystemGestureInsets()Landroidx/core/graphics/Insets; HPLandroidx/core/view/WindowInsetsCompat$Impl;->(Landroidx/core/view/WindowInsetsCompat;)V HPLandroidx/core/view/WindowInsetsCompat;->(Landroid/view/WindowInsets;)V HPLandroidx/core/view/WindowInsetsCompat;->getSystemWindowInsetBottom()I HPLandroidx/core/view/WindowInsetsCompat;->getSystemWindowInsetLeft()I HPLandroidx/core/view/WindowInsetsCompat;->getSystemWindowInsetRight()I HPLandroidx/core/view/WindowInsetsCompat;->getSystemWindowInsetTop()I HPLandroidx/core/view/WindowInsetsCompat;->toWindowInsetsCompat(Landroid/view/WindowInsets;Landroid/view/View;)Landroidx/core/view/WindowInsetsCompat; HPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat$CollectionItemInfoCompat;->obtain(IIIIZZ)Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat$CollectionItemInfoCompat; HPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->(Landroid/view/accessibility/AccessibilityNodeInfo;)V HPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->setCollectionItemInfo(Ljava/lang/Object;)V HPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->setPaneTitle(Ljava/lang/CharSequence;)V HPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->setStateDescription(Ljava/lang/CharSequence;)V HPLandroidx/customview/widget/ViewDragHelper;->shouldInterceptTouchEvent(Landroid/view/MotionEvent;)Z HPLandroidx/databinding/BaseObservable;->notifyPropertyChanged(I)V HPLandroidx/databinding/MergedDataBinderMapper;->getDataBinder(Landroidx/databinding/DataBindingComponent;Landroid/view/View;I)Landroidx/databinding/ViewDataBinding; HPLandroidx/databinding/ViewDataBinding$6;->onViewAttachedToWindow(Landroid/view/View;)V HPLandroidx/databinding/ViewDataBinding$7;->run()V HPLandroidx/databinding/ViewDataBinding$8;->doFrame(J)V HPLandroidx/databinding/ViewDataBinding;->(Ljava/lang/Object;Landroid/view/View;I)V HPLandroidx/databinding/ViewDataBinding;->executeBindingsInternal()V HPLandroidx/databinding/ViewDataBinding;->executePendingBindings()V HPLandroidx/databinding/ViewDataBinding;->handleFieldChange(ILjava/lang/Object;I)V HPLandroidx/databinding/ViewDataBinding;->isNumeric(Ljava/lang/String;I)Z HPLandroidx/databinding/ViewDataBinding;->mapBindings(Landroidx/databinding/DataBindingComponent;Landroid/view/View;[Ljava/lang/Object;Lcom/google/firebase/iid/zzk;Landroid/util/SparseIntArray;Z)V HPLandroidx/databinding/ViewDataBinding;->registerTo(ILjava/lang/Object;Landroidx/databinding/CreateWeakListener;)V HPLandroidx/databinding/ViewDataBinding;->requestRebind()V HPLandroidx/databinding/ViewDataBinding;->safeUnbox(Ljava/lang/Boolean;)Z HPLandroidx/databinding/ViewDataBinding;->setLifecycleOwner(Landroidx/lifecycle/LifecycleOwner;)V HPLandroidx/databinding/ViewDataBindingKtx$StateFlowListener$startCollection$1$invokeSuspend$$inlined$collect$1;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HPLandroidx/databinding/ViewDataBindingKtx$StateFlowListener$startCollection$1;->(Landroidx/databinding/ViewDataBindingKtx$StateFlowListener;Lkotlinx/coroutines/flow/Flow;Lkotlin/coroutines/Continuation;)V HPLandroidx/databinding/ViewDataBindingKtx$StateFlowListener$startCollection$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; HPLandroidx/databinding/ViewDataBindingKtx$StateFlowListener$startCollection$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/databinding/ViewDataBindingKtx$StateFlowListener;->setLifecycleOwner(Landroidx/lifecycle/LifecycleOwner;)V HPLandroidx/databinding/ViewDataBindingKtx$StateFlowListener;->startCollection(Landroidx/lifecycle/LifecycleOwner;Lkotlinx/coroutines/flow/Flow;)V HPLandroidx/databinding/ViewStubProxy;->arrayContains([II)Z HPLandroidx/databinding/ViewStubProxy;->getTintListForDrawableRes(Landroid/content/Context;I)Landroid/content/res/ColorStateList; HPLandroidx/datastore/core/SingleProcessDataStore$data$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/fragment/app/Fragment;->()V HPLandroidx/fragment/app/Fragment;->getParentFragmentManager()Landroidx/fragment/app/FragmentManager; HPLandroidx/fragment/app/Fragment;->getViewModelStore()Landroidx/lifecycle/ViewModelStore; HPLandroidx/fragment/app/Fragment;->initState()V HPLandroidx/fragment/app/Fragment;->performAttach()V HPLandroidx/fragment/app/Fragment;->performCreateView(Landroid/view/LayoutInflater;Landroid/view/ViewGroup;Landroid/os/Bundle;)V HPLandroidx/fragment/app/Fragment;->performStart()V HPLandroidx/fragment/app/FragmentActivity;->dispatchFragmentsOnCreateView(Landroid/view/View;Ljava/lang/String;Landroid/content/Context;Landroid/util/AttributeSet;)Landroid/view/View; HPLandroidx/fragment/app/FragmentActivity;->onCreateView(Landroid/view/View;Ljava/lang/String;Landroid/content/Context;Landroid/util/AttributeSet;)Landroid/view/View; HPLandroidx/fragment/app/FragmentActivity;->onCreateView(Ljava/lang/String;Landroid/content/Context;Landroid/util/AttributeSet;)Landroid/view/View; HPLandroidx/fragment/app/FragmentContainerView;->(Landroid/content/Context;Landroid/util/AttributeSet;Landroidx/fragment/app/FragmentManager;)V HPLandroidx/fragment/app/FragmentContainerView;->dispatchDraw(Landroid/graphics/Canvas;)V HPLandroidx/fragment/app/FragmentContainerView;->drawChild(Landroid/graphics/Canvas;Landroid/view/View;J)Z HPLandroidx/fragment/app/FragmentLayoutInflaterFactory;->onCreateView(Landroid/view/View;Ljava/lang/String;Landroid/content/Context;Landroid/util/AttributeSet;)Landroid/view/View; HPLandroidx/fragment/app/FragmentManager;->()V HPLandroidx/fragment/app/FragmentManager;->attachController(Landroidx/fragment/app/FragmentHostCallback;Landroidx/fragment/app/FragmentContainer;Landroidx/fragment/app/Fragment;)V HPLandroidx/fragment/app/FragmentManager;->collectAllSpecialEffectsController()Ljava/util/Set; HPLandroidx/fragment/app/FragmentManager;->dispatchDestroy()V HPLandroidx/fragment/app/FragmentManager;->dispatchStateChange(I)V HPLandroidx/fragment/app/FragmentManager;->ensureExecReady(Z)V HPLandroidx/fragment/app/FragmentManager;->execPendingActions(Z)Z HPLandroidx/fragment/app/FragmentManager;->executeOpsTogether(Ljava/util/ArrayList;Ljava/util/ArrayList;II)V HPLandroidx/fragment/app/FragmentManager;->getSpecialEffectsControllerFactory()Landroidx/fragment/app/FragmentManager$3; HPLandroidx/fragment/app/FragmentManager;->isLoggingEnabled(I)Z HPLandroidx/fragment/app/FragmentManager;->moveToState(IZ)V HPLandroidx/fragment/app/FragmentManager;->noteStateNotSaved()V HPLandroidx/fragment/app/FragmentManager;->saveAllStateInternal()Landroid/os/Parcelable; HPLandroidx/fragment/app/FragmentManager;->startPendingDeferredFragments()V HPLandroidx/fragment/app/FragmentManager;->updateOnBackPressedCallbackEnabled()V HPLandroidx/fragment/app/FragmentStateManager;->attach()V HPLandroidx/fragment/app/FragmentStateManager;->computeExpectedState()I HPLandroidx/fragment/app/FragmentStateManager;->createView()V HPLandroidx/fragment/app/FragmentStateManager;->destroy()V HPLandroidx/fragment/app/FragmentStateManager;->moveToExpectedState()V HPLandroidx/fragment/app/FragmentViewLifecycleOwner;->getLifecycle()Landroidx/lifecycle/Lifecycle; HPLandroidx/fragment/app/FragmentViewLifecycleOwner;->initialize()V HPLandroidx/fragment/app/SpecialEffectsController$1;->run()V HPLandroidx/fragment/app/SpecialEffectsController$FragmentStateManagerOperation;->(IILandroidx/fragment/app/FragmentStateManager;Landroidx/core/os/CancellationSignal;)V HPLandroidx/fragment/app/SpecialEffectsController;->findPendingOperation(Landroidx/fragment/app/Fragment;)Landroidx/fragment/app/SpecialEffectsController$FragmentStateManagerOperation; HPLandroidx/fragment/app/SpecialEffectsController;->forceCompleteAllOperations()V HPLandroidx/fragment/app/SpecialEffectsController;->getOrCreateController(Landroid/view/ViewGroup;Landroidx/fragment/app/FragmentManager$3;)Landroidx/fragment/app/SpecialEffectsController; HPLandroidx/fragment/app/SpecialEffectsController;->updateFinalState()V HPLandroidx/lifecycle/ClassesInfoCache$CallbackInfo;->invokeMethodsForEvent(Ljava/util/List;Landroidx/lifecycle/LifecycleOwner;Landroidx/lifecycle/Lifecycle$Event;Ljava/lang/Object;)V HPLandroidx/lifecycle/DispatchQueue;->()V HPLandroidx/lifecycle/DispatchQueue;->canRun()Z HPLandroidx/lifecycle/DispatchQueue;->drainQueue()V HPLandroidx/lifecycle/Lifecycle$Event;->downFrom(Landroidx/lifecycle/Lifecycle$State;)Landroidx/lifecycle/Lifecycle$Event; HPLandroidx/lifecycle/Lifecycle$Event;->getTargetState()Landroidx/lifecycle/Lifecycle$State; HPLandroidx/lifecycle/Lifecycle$Event;->upFrom(Landroidx/lifecycle/Lifecycle$State;)Landroidx/lifecycle/Lifecycle$Event; HPLandroidx/lifecycle/LifecycleController$observer$1;->onStateChanged(Landroidx/lifecycle/LifecycleOwner;Landroidx/lifecycle/Lifecycle$Event;)V HPLandroidx/lifecycle/LifecycleController;->(Landroidx/lifecycle/Lifecycle;Landroidx/lifecycle/Lifecycle$State;Landroidx/lifecycle/DispatchQueue;Lkotlinx/coroutines/Job;)V HPLandroidx/lifecycle/LifecycleController;->finish()V HPLandroidx/lifecycle/LifecycleCoroutineScope$launchWhenCreated$1;->(Landroidx/lifecycle/LifecycleCoroutineScopeImpl;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)V HPLandroidx/lifecycle/LifecycleCoroutineScope$launchWhenCreated$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; HPLandroidx/lifecycle/LifecycleCoroutineScope$launchWhenCreated$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/lifecycle/LifecycleCoroutineScopeImpl;->onStateChanged(Landroidx/lifecycle/LifecycleOwner;Landroidx/lifecycle/Lifecycle$Event;)V HPLandroidx/lifecycle/LifecycleRegistry$ObserverWithState;->(Landroidx/lifecycle/LifecycleObserver;Landroidx/lifecycle/Lifecycle$State;)V HPLandroidx/lifecycle/LifecycleRegistry$ObserverWithState;->dispatchEvent(Landroidx/lifecycle/LifecycleOwner;Landroidx/lifecycle/Lifecycle$Event;)V HPLandroidx/lifecycle/LifecycleRegistry;->(Landroidx/lifecycle/LifecycleOwner;)V HPLandroidx/lifecycle/LifecycleRegistry;->addObserver(Landroidx/lifecycle/LifecycleObserver;)V HPLandroidx/lifecycle/LifecycleRegistry;->calculateTargetState(Landroidx/lifecycle/LifecycleObserver;)Landroidx/lifecycle/Lifecycle$State; HPLandroidx/lifecycle/LifecycleRegistry;->enforceMainThreadIfNeeded(Ljava/lang/String;)V HPLandroidx/lifecycle/LifecycleRegistry;->handleLifecycleEvent(Landroidx/lifecycle/Lifecycle$Event;)V HPLandroidx/lifecycle/LifecycleRegistry;->min(Landroidx/lifecycle/Lifecycle$State;Landroidx/lifecycle/Lifecycle$State;)Landroidx/lifecycle/Lifecycle$State; HPLandroidx/lifecycle/LifecycleRegistry;->moveToState(Landroidx/lifecycle/Lifecycle$State;)V HPLandroidx/lifecycle/LifecycleRegistry;->popParentState()V HPLandroidx/lifecycle/LifecycleRegistry;->removeObserver(Landroidx/lifecycle/LifecycleObserver;)V HPLandroidx/lifecycle/PausingDispatcher;->()V HPLandroidx/lifecycle/PausingDispatcher;->isDispatchNeeded(Lkotlin/coroutines/CoroutineContext;)Z HPLandroidx/lifecycle/PausingDispatcherKt$whenStateAtLeast$2;->(Landroidx/lifecycle/Lifecycle;Landroidx/lifecycle/Lifecycle$State;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)V HPLandroidx/lifecycle/PausingDispatcherKt$whenStateAtLeast$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/lifecycle/PausingDispatcherKt$whenStateAtLeast$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/lifecycle/ReflectiveGenericLifecycleObserver;->(Ljava/lang/Object;)V HPLandroidx/lifecycle/ReflectiveGenericLifecycleObserver;->onStateChanged(Landroidx/lifecycle/LifecycleOwner;Landroidx/lifecycle/Lifecycle$Event;)V HPLandroidx/lifecycle/RepeatOnLifecycleKt$repeatOnLifecycle$3$1$1$1$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/lifecycle/RepeatOnLifecycleKt$repeatOnLifecycle$3$1$1$1;->onStateChanged(Landroidx/lifecycle/LifecycleOwner;Landroidx/lifecycle/Lifecycle$Event;)V HPLandroidx/lifecycle/RepeatOnLifecycleKt$repeatOnLifecycle$3$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/lifecycle/ViewModelProvider;->acquire(Landroid/content/Context;Ljava/lang/String;)Landroidx/lifecycle/ViewModelProvider; HPLandroidx/lifecycle/ViewModelProvider;->get(Ljava/lang/Class;)Landroidx/lifecycle/ViewModel; HPLandroidx/navigation/NavBackStackEntry;->(Landroid/content/Context;Landroidx/navigation/NavDestination;Landroid/os/Bundle;Landroidx/lifecycle/Lifecycle$State;Landroidx/navigation/NavViewModelStoreProvider;Ljava/lang/String;Landroid/os/Bundle;)V HPLandroidx/navigation/NavBackStackEntry;->hashCode()I HPLandroidx/navigation/NavBackStackEntry;->updateState()V HPLandroidx/navigation/NavController$$ExternalSyntheticLambda0;->onStateChanged(Landroidx/lifecycle/LifecycleOwner;Landroidx/lifecycle/Lifecycle$Event;)V HPLandroidx/navigation/NavDestination;->(Landroidx/navigation/Navigator;)V HPLandroidx/navigation/NavDestination;->equals(Ljava/lang/Object;)Z HPLandroidx/navigation/NavDestination;->hashCode()I HPLandroidx/navigation/NavDestination;->onInflate(Landroid/content/Context;Landroid/util/AttributeSet;)V HPLandroidx/navigation/NavHostController;->(Landroid/content/Context;)V HPLandroidx/navigation/NavHostController;->addEntryToBackStack(Landroidx/navigation/NavDestination;Landroid/os/Bundle;Landroidx/navigation/NavBackStackEntry;Ljava/util/List;)V HPLandroidx/navigation/NavHostController;->onGraphCreated(Landroid/os/Bundle;)V HPLandroidx/navigation/NavHostController;->updateBackStackLifecycle$navigation_runtime_release()V HPLandroidx/navigation/NavInflater;->inflate(Landroid/content/res/Resources;Landroid/content/res/XmlResourceParser;Landroid/util/AttributeSet;I)Landroidx/navigation/NavDestination; HPLandroidx/navigation/NavInflater;->inflateArgument(Landroid/content/res/TypedArray;Landroid/content/res/Resources;I)Landroidx/navigation/NavArgument; HPLandroidx/navigation/NavigatorProvider;->getNavigator(Ljava/lang/String;)Landroidx/navigation/Navigator; HPLandroidx/navigation/R$id;->checkNotEmpty(Ljava/lang/String;)Ljava/lang/String; HPLandroidx/navigation/R$id;->read(Ljava/io/InputStream;I)[B HPLandroidx/navigation/R$id;->readUInt(Ljava/io/InputStream;I)J HPLandroidx/navigation/R$id;->readUInt16(Ljava/io/InputStream;)I HPLandroidx/navigation/R$id;->resumeCancellableWith(Lkotlin/coroutines/Continuation;Ljava/lang/Object;Lkotlin/jvm/functions/Function1;)V HPLandroidx/navigation/R$id;->writeUInt(Ljava/io/OutputStream;JI)V HPLandroidx/navigation/R$id;->writeUInt16(Ljava/io/OutputStream;I)V HPLandroidx/navigation/fragment/FragmentNavigator$Destination;->onInflate(Landroid/content/Context;Landroid/util/AttributeSet;)V HPLandroidx/navigation/fragment/FragmentNavigator;->navigate(Ljava/util/List;Landroidx/navigation/NavOptions;Landroidx/navigation/Navigator$Extras;)V HPLandroidx/navigation/fragment/NavHostFragment;->onCreate(Landroid/os/Bundle;)V HPLandroidx/recyclerview/widget/AdapterHelper;->(Landroidx/recyclerview/widget/RecyclerView$4;)V HPLandroidx/recyclerview/widget/AdapterHelper;->consumePostponedUpdates()V HPLandroidx/recyclerview/widget/AdapterHelper;->consumeUpdatesInOnePass()V HPLandroidx/recyclerview/widget/AdapterHelper;->dispatchAndUpdateViewHolders(Landroidx/recyclerview/widget/AdapterHelper$UpdateOp;)V HPLandroidx/recyclerview/widget/AdapterHelper;->findPositionOffset(II)I HPLandroidx/recyclerview/widget/AdapterHelper;->hasPendingUpdates()Z HPLandroidx/recyclerview/widget/AdapterHelper;->obtainUpdateOp(IIILjava/lang/Object;)Landroidx/recyclerview/widget/AdapterHelper$UpdateOp; HPLandroidx/recyclerview/widget/AdapterHelper;->preProcess()V HPLandroidx/recyclerview/widget/AdapterHelper;->recycleUpdateOpsAndClearList(Ljava/util/List;)V HPLandroidx/recyclerview/widget/AsyncListDiffer$1$2;->run()V HPLandroidx/recyclerview/widget/AsyncListDiffer$1;->run()V HPLandroidx/recyclerview/widget/ChildHelper$Bucket;->clear(I)V HPLandroidx/recyclerview/widget/ChildHelper$Bucket;->countOnesBefore(I)I HPLandroidx/recyclerview/widget/ChildHelper$Bucket;->get(I)Z HPLandroidx/recyclerview/widget/ChildHelper$Bucket;->insert(IZ)V HPLandroidx/recyclerview/widget/ChildHelper$Bucket;->remove(I)Z HPLandroidx/recyclerview/widget/ChildHelper;->(Landroidx/recyclerview/widget/RecyclerView$4;)V HPLandroidx/recyclerview/widget/ChildHelper;->addView(Landroid/view/View;IZ)V HPLandroidx/recyclerview/widget/ChildHelper;->attachViewToParent(Landroid/view/View;ILandroid/view/ViewGroup$LayoutParams;Z)V HPLandroidx/recyclerview/widget/ChildHelper;->detachViewFromParent(I)V HPLandroidx/recyclerview/widget/ChildHelper;->getChildAt(I)Landroid/view/View; HPLandroidx/recyclerview/widget/ChildHelper;->getChildCount()I HPLandroidx/recyclerview/widget/ChildHelper;->getOffset(I)I HPLandroidx/recyclerview/widget/ChildHelper;->getUnfilteredChildAt(I)Landroid/view/View; HPLandroidx/recyclerview/widget/ChildHelper;->getUnfilteredChildCount()I HPLandroidx/recyclerview/widget/ChildHelper;->isHidden(Landroid/view/View;)Z HPLandroidx/recyclerview/widget/ChildHelper;->removeViewAt(I)V HPLandroidx/recyclerview/widget/DefaultItemAnimator;->()V HPLandroidx/recyclerview/widget/DefaultItemAnimator;->endAnimations()V HPLandroidx/recyclerview/widget/DefaultItemAnimator;->isRunning()Z HPLandroidx/recyclerview/widget/DiffUtil$DiffResult;->(Landroidx/recyclerview/widget/OpReorderer;Ljava/util/List;[I[IZ)V HPLandroidx/recyclerview/widget/FastScroller$2;->onScrolled(Landroidx/recyclerview/widget/RecyclerView;II)V HPLandroidx/recyclerview/widget/GapWorker;->postFromTraversal(Landroidx/recyclerview/widget/RecyclerView;II)V HPLandroidx/recyclerview/widget/GapWorker;->prefetch(J)V HPLandroidx/recyclerview/widget/GapWorker;->prefetchPositionWithDeadline(Landroidx/recyclerview/widget/RecyclerView;IJ)Landroidx/recyclerview/widget/RecyclerView$ViewHolder; HPLandroidx/recyclerview/widget/GapWorker;->run()V HPLandroidx/recyclerview/widget/LinearLayoutManager$AnchorInfo;->assignFromView(Landroid/view/View;I)V HPLandroidx/recyclerview/widget/LinearLayoutManager$AnchorInfo;->reset()V HPLandroidx/recyclerview/widget/LinearLayoutManager$LayoutState;->hasMore(Landroidx/recyclerview/widget/RecyclerView$State;)Z HPLandroidx/recyclerview/widget/LinearLayoutManager$LayoutState;->next(Landroidx/recyclerview/widget/RecyclerView$Recycler;)Landroid/view/View; HPLandroidx/recyclerview/widget/LinearLayoutManager;->calculateExtraLayoutSpace(Landroidx/recyclerview/widget/RecyclerView$State;[I)V HPLandroidx/recyclerview/widget/LinearLayoutManager;->canScrollHorizontally()Z HPLandroidx/recyclerview/widget/LinearLayoutManager;->canScrollVertically()Z HPLandroidx/recyclerview/widget/LinearLayoutManager;->collectAdjacentPrefetchPositions(IILandroidx/recyclerview/widget/RecyclerView$State;Lcom/google/android/gms/internal/vision/zzfc;)V HPLandroidx/recyclerview/widget/LinearLayoutManager;->collectPrefetchPositionsForLayoutState(Landroidx/recyclerview/widget/RecyclerView$State;Landroidx/recyclerview/widget/LinearLayoutManager$LayoutState;Lcom/google/android/gms/internal/vision/zzfc;)V HPLandroidx/recyclerview/widget/LinearLayoutManager;->computeScrollExtent(Landroidx/recyclerview/widget/RecyclerView$State;)I HPLandroidx/recyclerview/widget/LinearLayoutManager;->computeScrollOffset(Landroidx/recyclerview/widget/RecyclerView$State;)I HPLandroidx/recyclerview/widget/LinearLayoutManager;->computeScrollRange(Landroidx/recyclerview/widget/RecyclerView$State;)I HPLandroidx/recyclerview/widget/LinearLayoutManager;->computeVerticalScrollExtent(Landroidx/recyclerview/widget/RecyclerView$State;)I HPLandroidx/recyclerview/widget/LinearLayoutManager;->computeVerticalScrollOffset(Landroidx/recyclerview/widget/RecyclerView$State;)I HPLandroidx/recyclerview/widget/LinearLayoutManager;->computeVerticalScrollRange(Landroidx/recyclerview/widget/RecyclerView$State;)I HPLandroidx/recyclerview/widget/LinearLayoutManager;->ensureLayoutState()V HPLandroidx/recyclerview/widget/LinearLayoutManager;->fill(Landroidx/recyclerview/widget/RecyclerView$Recycler;Landroidx/recyclerview/widget/LinearLayoutManager$LayoutState;Landroidx/recyclerview/widget/RecyclerView$State;Z)I HPLandroidx/recyclerview/widget/LinearLayoutManager;->findFirstVisibleChildClosestToEnd(ZZ)Landroid/view/View; HPLandroidx/recyclerview/widget/LinearLayoutManager;->findFirstVisibleChildClosestToStart(ZZ)Landroid/view/View; HPLandroidx/recyclerview/widget/LinearLayoutManager;->findFirstVisibleItemPosition()I HPLandroidx/recyclerview/widget/LinearLayoutManager;->findLastVisibleItemPosition()I HPLandroidx/recyclerview/widget/LinearLayoutManager;->findOneVisibleChild(IIZZ)Landroid/view/View; HPLandroidx/recyclerview/widget/LinearLayoutManager;->findReferenceChild(Landroidx/recyclerview/widget/RecyclerView$Recycler;Landroidx/recyclerview/widget/RecyclerView$State;III)Landroid/view/View; HPLandroidx/recyclerview/widget/LinearLayoutManager;->fixLayoutEndGap(ILandroidx/recyclerview/widget/RecyclerView$Recycler;Landroidx/recyclerview/widget/RecyclerView$State;Z)I HPLandroidx/recyclerview/widget/LinearLayoutManager;->fixLayoutStartGap(ILandroidx/recyclerview/widget/RecyclerView$Recycler;Landroidx/recyclerview/widget/RecyclerView$State;Z)I HPLandroidx/recyclerview/widget/LinearLayoutManager;->getChildClosestToEnd()Landroid/view/View; HPLandroidx/recyclerview/widget/LinearLayoutManager;->getChildClosestToStart()Landroid/view/View; HPLandroidx/recyclerview/widget/LinearLayoutManager;->isLayoutRTL()Z HPLandroidx/recyclerview/widget/LinearLayoutManager;->onInitializeAccessibilityEvent(Landroid/view/accessibility/AccessibilityEvent;)V HPLandroidx/recyclerview/widget/LinearLayoutManager;->onLayoutChildren(Landroidx/recyclerview/widget/RecyclerView$Recycler;Landroidx/recyclerview/widget/RecyclerView$State;)V HPLandroidx/recyclerview/widget/LinearLayoutManager;->onLayoutCompleted(Landroidx/recyclerview/widget/RecyclerView$State;)V HPLandroidx/recyclerview/widget/LinearLayoutManager;->recycleByLayoutState(Landroidx/recyclerview/widget/RecyclerView$Recycler;Landroidx/recyclerview/widget/LinearLayoutManager$LayoutState;)V HPLandroidx/recyclerview/widget/LinearLayoutManager;->recycleChildren(Landroidx/recyclerview/widget/RecyclerView$Recycler;II)V HPLandroidx/recyclerview/widget/LinearLayoutManager;->resolveIsInfinite()Z HPLandroidx/recyclerview/widget/LinearLayoutManager;->resolveShouldLayoutReverse()V HPLandroidx/recyclerview/widget/LinearLayoutManager;->scrollBy(ILandroidx/recyclerview/widget/RecyclerView$Recycler;Landroidx/recyclerview/widget/RecyclerView$State;)I HPLandroidx/recyclerview/widget/LinearLayoutManager;->scrollVerticallyBy(ILandroidx/recyclerview/widget/RecyclerView$Recycler;Landroidx/recyclerview/widget/RecyclerView$State;)I HPLandroidx/recyclerview/widget/LinearLayoutManager;->shouldMeasureTwice()Z HPLandroidx/recyclerview/widget/LinearLayoutManager;->supportsPredictiveItemAnimations()Z HPLandroidx/recyclerview/widget/LinearLayoutManager;->updateLayoutState(IIZLandroidx/recyclerview/widget/RecyclerView$State;)V HPLandroidx/recyclerview/widget/LinearLayoutManager;->updateLayoutStateToFillEnd(II)V HPLandroidx/recyclerview/widget/LinearLayoutManager;->updateLayoutStateToFillStart(II)V HPLandroidx/recyclerview/widget/ListAdapter;->getItemCount()I HPLandroidx/recyclerview/widget/OpReorderer;->areItemsTheSame(II)Z HPLandroidx/recyclerview/widget/OpReorderer;->getChangePayload(II)Ljava/lang/Object; HPLandroidx/recyclerview/widget/OrientationHelper$1;->getDecoratedEnd(Landroid/view/View;)I HPLandroidx/recyclerview/widget/OrientationHelper$1;->getDecoratedMeasurement(Landroid/view/View;)I HPLandroidx/recyclerview/widget/OrientationHelper$1;->getDecoratedMeasurementInOther(Landroid/view/View;)I HPLandroidx/recyclerview/widget/OrientationHelper$1;->getDecoratedStart(Landroid/view/View;)I HPLandroidx/recyclerview/widget/OrientationHelper$1;->getEnd()I HPLandroidx/recyclerview/widget/OrientationHelper$1;->getEndAfterPadding()I HPLandroidx/recyclerview/widget/OrientationHelper$1;->getEndPadding()I HPLandroidx/recyclerview/widget/OrientationHelper$1;->getMode()I HPLandroidx/recyclerview/widget/OrientationHelper$1;->getStartAfterPadding()I HPLandroidx/recyclerview/widget/OrientationHelper$1;->getTotalSpace()I HPLandroidx/recyclerview/widget/OrientationHelper$1;->getTransformedEndWithDecoration(Landroid/view/View;)I HPLandroidx/recyclerview/widget/OrientationHelper$1;->offsetChildren(I)V HPLandroidx/recyclerview/widget/RecyclerView$4;->findViewHolder(I)Landroidx/recyclerview/widget/RecyclerView$ViewHolder; HPLandroidx/recyclerview/widget/RecyclerView$4;->getChildAt(I)Landroid/view/View; HPLandroidx/recyclerview/widget/RecyclerView$4;->getChildCount()I HPLandroidx/recyclerview/widget/RecyclerView$4;->markViewHoldersUpdated(IILjava/lang/Object;)V HPLandroidx/recyclerview/widget/RecyclerView$4;->removeViewAt(I)V HPLandroidx/recyclerview/widget/RecyclerView$ItemAnimator;->()V HPLandroidx/recyclerview/widget/RecyclerView$ItemDecoration;->getItemOffsets(Landroid/graphics/Rect;Landroid/view/View;Landroidx/recyclerview/widget/RecyclerView;Landroidx/recyclerview/widget/RecyclerView$State;)V HPLandroidx/recyclerview/widget/RecyclerView$LayoutManager$1;->getChildEnd(Landroid/view/View;)I HPLandroidx/recyclerview/widget/RecyclerView$LayoutManager$1;->getChildStart(Landroid/view/View;)I HPLandroidx/recyclerview/widget/RecyclerView$LayoutManager$1;->getParentEnd()I HPLandroidx/recyclerview/widget/RecyclerView$LayoutManager$1;->getParentStart()I HPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->()V HPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->addViewInt(Landroid/view/View;IZ)V HPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->calculateItemDecorationsForChild(Landroid/view/View;Landroid/graphics/Rect;)V HPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->chooseSize(III)I HPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->detachAndScrapAttachedViews(Landroidx/recyclerview/widget/RecyclerView$Recycler;)V HPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getBottomDecorationHeight(Landroid/view/View;)I HPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getChildAt(I)Landroid/view/View; HPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getChildCount()I HPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getChildMeasureSpec(IIIIZ)I HPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getDecoratedBottom(Landroid/view/View;)I HPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getDecoratedBoundsWithMargins(Landroid/view/View;Landroid/graphics/Rect;)V HPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getDecoratedLeft(Landroid/view/View;)I HPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getDecoratedMeasuredHeight(Landroid/view/View;)I HPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getDecoratedMeasuredWidth(Landroid/view/View;)I HPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getDecoratedRight(Landroid/view/View;)I HPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getDecoratedTop(Landroid/view/View;)I HPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getFocusedChild()Landroid/view/View; HPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getLayoutDirection()I HPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getLeftDecorationWidth(Landroid/view/View;)I HPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getMinimumHeight()I HPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getMinimumWidth()I HPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getPaddingBottom()I HPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getPaddingEnd()I HPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getPaddingLeft()I HPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getPaddingRight()I HPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getPaddingStart()I HPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getPaddingTop()I HPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getPosition(Landroid/view/View;)I HPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getRightDecorationWidth(Landroid/view/View;)I HPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getTopDecorationHeight(Landroid/view/View;)I HPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getTransformedBoundingBox(Landroid/view/View;ZLandroid/graphics/Rect;)V HPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->isMeasurementUpToDate(III)Z HPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->layoutDecoratedWithMargins(Landroid/view/View;IIII)V HPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->offsetChildrenHorizontal(I)V HPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->offsetChildrenVertical(I)V HPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->onInitializeAccessibilityEvent(Landroid/view/accessibility/AccessibilityEvent;)V HPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->onInitializeAccessibilityNodeInfo(Landroidx/recyclerview/widget/RecyclerView$Recycler;Landroidx/recyclerview/widget/RecyclerView$State;Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat;)V HPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->onInitializeAccessibilityNodeInfoForItem(Landroid/view/View;Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat;)V HPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->onInitializeAccessibilityNodeInfoForItem(Landroidx/recyclerview/widget/RecyclerView$Recycler;Landroidx/recyclerview/widget/RecyclerView$State;Landroid/view/View;Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat;)V HPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->removeAndRecycleAllViews(Landroidx/recyclerview/widget/RecyclerView$Recycler;)V HPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->removeAndRecycleScrapInt(Landroidx/recyclerview/widget/RecyclerView$Recycler;)V HPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->removeAndRecycleViewAt(ILandroidx/recyclerview/widget/RecyclerView$Recycler;)V HPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->setExactMeasureSpecsFrom(Landroidx/recyclerview/widget/RecyclerView;)V HPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->setMeasureSpecs(II)V HPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->setMeasuredDimension(Landroid/graphics/Rect;II)V HPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->setMeasuredDimensionFromChildren(II)V HPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->setRecyclerView(Landroidx/recyclerview/widget/RecyclerView;)V HPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->shouldMeasureChild(Landroid/view/View;IILandroidx/recyclerview/widget/RecyclerView$LayoutParams;)Z HPLandroidx/recyclerview/widget/RecyclerView$LayoutParams;->(Landroid/content/Context;Landroid/util/AttributeSet;)V HPLandroidx/recyclerview/widget/RecyclerView$LayoutParams;->getViewLayoutPosition()I HPLandroidx/recyclerview/widget/RecyclerView$LayoutParams;->isItemChanged()Z HPLandroidx/recyclerview/widget/RecyclerView$LayoutParams;->isItemRemoved()Z HPLandroidx/recyclerview/widget/RecyclerView$RecycledViewPool;->getScrapDataForType(I)Landroidx/recyclerview/widget/RecyclerView$RecycledViewPool$ScrapData; HPLandroidx/recyclerview/widget/RecyclerView$Recycler;->(Landroidx/recyclerview/widget/RecyclerView;)V HPLandroidx/recyclerview/widget/RecyclerView$Recycler;->addViewHolderToRecycledViewPool(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;Z)V HPLandroidx/recyclerview/widget/RecyclerView$Recycler;->clear()V HPLandroidx/recyclerview/widget/RecyclerView$Recycler;->getRecycledViewPool()Landroidx/recyclerview/widget/RecyclerView$RecycledViewPool; HPLandroidx/recyclerview/widget/RecyclerView$Recycler;->getViewForPosition(I)Landroid/view/View; HPLandroidx/recyclerview/widget/RecyclerView$Recycler;->recycleAndClearCachedViews()V HPLandroidx/recyclerview/widget/RecyclerView$Recycler;->recycleCachedViewAt(I)V HPLandroidx/recyclerview/widget/RecyclerView$Recycler;->recycleView(Landroid/view/View;)V HPLandroidx/recyclerview/widget/RecyclerView$Recycler;->recycleViewHolderInternal(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;)V HPLandroidx/recyclerview/widget/RecyclerView$Recycler;->scrapView(Landroid/view/View;)V HPLandroidx/recyclerview/widget/RecyclerView$Recycler;->unscrapView(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;)V HPLandroidx/recyclerview/widget/RecyclerView$Recycler;->updateViewCacheSize()V HPLandroidx/recyclerview/widget/RecyclerView$RecyclerViewDataObserver;->onItemRangeChanged(IILjava/lang/Object;)V HPLandroidx/recyclerview/widget/RecyclerView$State;->()V HPLandroidx/recyclerview/widget/RecyclerView$State;->assertLayoutStep(I)V HPLandroidx/recyclerview/widget/RecyclerView$State;->getItemCount()I HPLandroidx/recyclerview/widget/RecyclerView$ViewFlinger;->(Landroidx/recyclerview/widget/RecyclerView;)V HPLandroidx/recyclerview/widget/RecyclerView$ViewFlinger;->postOnAnimation()V HPLandroidx/recyclerview/widget/RecyclerView$ViewFlinger;->run()V HPLandroidx/recyclerview/widget/RecyclerView$ViewFlinger;->stop()V HPLandroidx/recyclerview/widget/RecyclerView$ViewHolder;->(Landroid/view/View;)V HPLandroidx/recyclerview/widget/RecyclerView$ViewHolder;->addFlags(I)V HPLandroidx/recyclerview/widget/RecyclerView$ViewHolder;->clearReturnedFromScrapFlag()V HPLandroidx/recyclerview/widget/RecyclerView$ViewHolder;->getAdapterPosition()I HPLandroidx/recyclerview/widget/RecyclerView$ViewHolder;->getLayoutPosition()I HPLandroidx/recyclerview/widget/RecyclerView$ViewHolder;->getUnmodifiedPayloads()Ljava/util/List; HPLandroidx/recyclerview/widget/RecyclerView$ViewHolder;->hasAnyOfTheFlags(I)Z HPLandroidx/recyclerview/widget/RecyclerView$ViewHolder;->isAttachedToTransitionOverlay()Z HPLandroidx/recyclerview/widget/RecyclerView$ViewHolder;->isBound()Z HPLandroidx/recyclerview/widget/RecyclerView$ViewHolder;->isInvalid()Z HPLandroidx/recyclerview/widget/RecyclerView$ViewHolder;->isRecyclable()Z HPLandroidx/recyclerview/widget/RecyclerView$ViewHolder;->isRemoved()Z HPLandroidx/recyclerview/widget/RecyclerView$ViewHolder;->isScrap()Z HPLandroidx/recyclerview/widget/RecyclerView$ViewHolder;->isTmpDetached()Z HPLandroidx/recyclerview/widget/RecyclerView$ViewHolder;->isUpdated()Z HPLandroidx/recyclerview/widget/RecyclerView$ViewHolder;->resetInternal()V HPLandroidx/recyclerview/widget/RecyclerView$ViewHolder;->setFlags(II)V HPLandroidx/recyclerview/widget/RecyclerView$ViewHolder;->shouldIgnore()Z HPLandroidx/recyclerview/widget/RecyclerView$ViewHolder;->wasReturnedFromScrap()Z HPLandroidx/recyclerview/widget/RecyclerView;->(Landroid/content/Context;Landroid/util/AttributeSet;I)V HPLandroidx/recyclerview/widget/RecyclerView;->access$000(Landroidx/recyclerview/widget/RecyclerView;Landroid/view/View;ILandroid/view/ViewGroup$LayoutParams;)V HPLandroidx/recyclerview/widget/RecyclerView;->access$100(Landroidx/recyclerview/widget/RecyclerView;I)V HPLandroidx/recyclerview/widget/RecyclerView;->access$200(Landroidx/recyclerview/widget/RecyclerView;)Z HPLandroidx/recyclerview/widget/RecyclerView;->access$300(Landroidx/recyclerview/widget/RecyclerView;II)V HPLandroidx/recyclerview/widget/RecyclerView;->assertNotInLayoutOrScroll(Ljava/lang/String;)V HPLandroidx/recyclerview/widget/RecyclerView;->checkLayoutParams(Landroid/view/ViewGroup$LayoutParams;)Z HPLandroidx/recyclerview/widget/RecyclerView;->clearNestedRecyclerViewIfNotNested(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;)V HPLandroidx/recyclerview/widget/RecyclerView;->clearOldPositions()V HPLandroidx/recyclerview/widget/RecyclerView;->computeVerticalScrollExtent()I HPLandroidx/recyclerview/widget/RecyclerView;->computeVerticalScrollOffset()I HPLandroidx/recyclerview/widget/RecyclerView;->computeVerticalScrollRange()I HPLandroidx/recyclerview/widget/RecyclerView;->considerReleasingGlowsOnScroll(II)V HPLandroidx/recyclerview/widget/RecyclerView;->consumePendingUpdateOperations()V HPLandroidx/recyclerview/widget/RecyclerView;->defaultOnMeasure(II)V HPLandroidx/recyclerview/widget/RecyclerView;->dispatchChildDetached(Landroid/view/View;)V HPLandroidx/recyclerview/widget/RecyclerView;->dispatchLayout()V HPLandroidx/recyclerview/widget/RecyclerView;->dispatchLayoutStep1()V HPLandroidx/recyclerview/widget/RecyclerView;->dispatchLayoutStep2()V HPLandroidx/recyclerview/widget/RecyclerView;->dispatchNestedPreScroll(II[I[II)Z HPLandroidx/recyclerview/widget/RecyclerView;->dispatchNestedScroll(IIII[II[I)V HPLandroidx/recyclerview/widget/RecyclerView;->dispatchOnScrolled(II)V HPLandroidx/recyclerview/widget/RecyclerView;->draw(Landroid/graphics/Canvas;)V HPLandroidx/recyclerview/widget/RecyclerView;->drawChild(Landroid/graphics/Canvas;Landroid/view/View;J)Z HPLandroidx/recyclerview/widget/RecyclerView;->fillRemainingScrollValues(Landroidx/recyclerview/widget/RecyclerView$State;)V HPLandroidx/recyclerview/widget/RecyclerView;->findMinMaxChildLayoutPositions([I)V HPLandroidx/recyclerview/widget/RecyclerView;->findNestedRecyclerView(Landroid/view/View;)Landroidx/recyclerview/widget/RecyclerView; HPLandroidx/recyclerview/widget/RecyclerView;->generateLayoutParams(Landroid/util/AttributeSet;)Landroid/view/ViewGroup$LayoutParams; HPLandroidx/recyclerview/widget/RecyclerView;->getAccessibilityClassName()Ljava/lang/CharSequence; HPLandroidx/recyclerview/widget/RecyclerView;->getAdapterPositionFor(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;)I HPLandroidx/recyclerview/widget/RecyclerView;->getBaseline()I HPLandroidx/recyclerview/widget/RecyclerView;->getChildAdapterPosition(Landroid/view/View;)I HPLandroidx/recyclerview/widget/RecyclerView;->getChildViewHolder(Landroid/view/View;)Landroidx/recyclerview/widget/RecyclerView$ViewHolder; HPLandroidx/recyclerview/widget/RecyclerView;->getChildViewHolderInt(Landroid/view/View;)Landroidx/recyclerview/widget/RecyclerView$ViewHolder; HPLandroidx/recyclerview/widget/RecyclerView;->getItemDecorInsetsForChild(Landroid/view/View;)Landroid/graphics/Rect; HPLandroidx/recyclerview/widget/RecyclerView;->getLayoutManager()Landroidx/recyclerview/widget/RecyclerView$LayoutManager; HPLandroidx/recyclerview/widget/RecyclerView;->getNanoTime()J HPLandroidx/recyclerview/widget/RecyclerView;->getScrollState()I HPLandroidx/recyclerview/widget/RecyclerView;->getScrollingChildHelper()Landroidx/core/view/NestedScrollingChildHelper; HPLandroidx/recyclerview/widget/RecyclerView;->hasPendingAdapterUpdates()Z HPLandroidx/recyclerview/widget/RecyclerView;->isAttachedToWindow()Z HPLandroidx/recyclerview/widget/RecyclerView;->isComputingLayout()Z HPLandroidx/recyclerview/widget/RecyclerView;->markItemDecorInsetsDirty()V HPLandroidx/recyclerview/widget/RecyclerView;->onAttachedToWindow()V HPLandroidx/recyclerview/widget/RecyclerView;->onDetachedFromWindow()V HPLandroidx/recyclerview/widget/RecyclerView;->onDraw(Landroid/graphics/Canvas;)V HPLandroidx/recyclerview/widget/RecyclerView;->onEnterLayoutOrScroll()V HPLandroidx/recyclerview/widget/RecyclerView;->onExitLayoutOrScroll(Z)V HPLandroidx/recyclerview/widget/RecyclerView;->onInterceptTouchEvent(Landroid/view/MotionEvent;)Z HPLandroidx/recyclerview/widget/RecyclerView;->onLayout(ZIIII)V HPLandroidx/recyclerview/widget/RecyclerView;->onMeasure(II)V HPLandroidx/recyclerview/widget/RecyclerView;->onTouchEvent(Landroid/view/MotionEvent;)Z HPLandroidx/recyclerview/widget/RecyclerView;->processAdapterUpdatesAndSetAnimationFlags()V HPLandroidx/recyclerview/widget/RecyclerView;->processDataSetCompletelyChanged(Z)V HPLandroidx/recyclerview/widget/RecyclerView;->removeAndRecycleViews()V HPLandroidx/recyclerview/widget/RecyclerView;->requestLayout()V HPLandroidx/recyclerview/widget/RecyclerView;->scrollStep(II[I)V HPLandroidx/recyclerview/widget/RecyclerView;->sendAccessibilityEventUnchecked(Landroid/view/accessibility/AccessibilityEvent;)V HPLandroidx/recyclerview/widget/RecyclerView;->setAdapter(Landroidx/recyclerview/widget/RecyclerView$Adapter;)V HPLandroidx/recyclerview/widget/RecyclerView;->setLayoutManager(Landroidx/recyclerview/widget/RecyclerView$LayoutManager;)V HPLandroidx/recyclerview/widget/RecyclerView;->setScrollState(I)V HPLandroidx/recyclerview/widget/RecyclerView;->startInterceptRequestLayout()V HPLandroidx/recyclerview/widget/RecyclerView;->stopInterceptRequestLayout(Z)V HPLandroidx/recyclerview/widget/RecyclerView;->stopNestedScroll()V HPLandroidx/recyclerview/widget/RecyclerView;->stopScroll()V HPLandroidx/recyclerview/widget/RecyclerViewAccessibilityDelegate$ItemDelegate;->getAccessibilityNodeProvider(Landroid/view/View;)Landroidx/core/view/PointerIconCompat; HPLandroidx/recyclerview/widget/RecyclerViewAccessibilityDelegate$ItemDelegate;->onInitializeAccessibilityNodeInfo(Landroid/view/View;Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat;)V HPLandroidx/recyclerview/widget/RecyclerViewAccessibilityDelegate;->onInitializeAccessibilityEvent(Landroid/view/View;Landroid/view/accessibility/AccessibilityEvent;)V HPLandroidx/recyclerview/widget/RecyclerViewAccessibilityDelegate;->onInitializeAccessibilityNodeInfo(Landroid/view/View;Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat;)V HPLandroidx/recyclerview/widget/RecyclerViewAccessibilityDelegate;->shouldIgnore()Z HPLandroidx/recyclerview/widget/ViewBoundsCheck$BoundFlags;->boundsMatch()Z HPLandroidx/recyclerview/widget/ViewBoundsCheck$BoundFlags;->compare(II)I HPLandroidx/recyclerview/widget/ViewInfoStore;->(I)V HPLandroidx/recyclerview/widget/ViewInfoStore;->clear()V HPLandroidx/recyclerview/widget/ViewInfoStore;->findOneViewWithinBoundFlags(IIII)Landroid/view/View; HPLandroidx/recyclerview/widget/ViewInfoStore;->removeFromDisappearedInLayout(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;)V HPLandroidx/recyclerview/widget/ViewInfoStore;->removeViewHolder(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;)V HPLandroidx/room/QueryInterceptorProgram;->bindString(ILjava/lang/String;)V HPLandroidx/room/Room$$ExternalSyntheticOutline0;->m(ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; HPLandroidx/room/Room$$ExternalSyntheticOutline0;->m(Ljava/lang/String;Ljava/lang/Object;)Ljava/lang/String; HPLandroidx/room/Room;->getCoroutineScope(Landroidx/lifecycle/Lifecycle;)Landroidx/lifecycle/LifecycleCoroutineScopeImpl; HPLandroidx/room/Room;->parse(Lorg/xmlpull/v1/XmlPullParser;Landroid/content/res/Resources;)Landroidx/core/content/res/FontResourcesParserCompat$FamilyResourceEntry; HPLandroidx/room/Room;->readCerts(Landroid/content/res/Resources;I)Ljava/util/List; HPLandroidx/room/Room;->setText(Landroid/widget/TextView;Ljava/lang/CharSequence;)V HPLandroidx/savedstate/Recreator;->onStateChanged(Landroidx/lifecycle/LifecycleOwner;Landroidx/lifecycle/Lifecycle$Event;)V HPLandroidx/savedstate/SavedStateRegistry$1;->onStateChanged(Landroidx/lifecycle/LifecycleOwner;Landroidx/lifecycle/Lifecycle$Event;)V HPLandroidx/savedstate/SavedStateRegistry;->()V HPLandroidx/savedstate/SavedStateRegistryController;->performRestore(Landroid/os/Bundle;)V HPLandroidx/slidingpanelayout/widget/SlidingPaneLayout;->draw(Landroid/graphics/Canvas;)V HPLandroidx/slidingpanelayout/widget/SlidingPaneLayout;->drawChild(Landroid/graphics/Canvas;Landroid/view/View;J)Z HPLandroidx/slidingpanelayout/widget/SlidingPaneLayout;->getSystemGestureInsets()Landroidx/core/graphics/Insets; HPLandroidx/slidingpanelayout/widget/SlidingPaneLayout;->isDimmed(Landroid/view/View;)Z HPLandroidx/slidingpanelayout/widget/SlidingPaneLayout;->isLayoutRtlSupport()Z HPLandroidx/slidingpanelayout/widget/SlidingPaneLayout;->onInterceptTouchEvent(Landroid/view/MotionEvent;)Z HPLandroidx/slidingpanelayout/widget/SlidingPaneLayout;->onLayout(ZIIII)V HPLandroidx/slidingpanelayout/widget/SlidingPaneLayout;->onMeasure(II)V HPLandroidx/swiperefreshlayout/widget/SwipeRefreshLayout;->onMeasure(II)V HPLandroidx/transition/GhostViewPort$1;->onPreDraw()Z HPLandroidx/transition/Transition;->()V HPLandroidx/transition/ViewOverlayApi14;->zzd()V HPLandroidx/transition/ViewOverlayApi14;->zzn()Landroid/content/Context; HPLandroidx/transition/ViewOverlayApi14;->zzr()Lcom/google/android/gms/measurement/internal/zzes; HPLandroidx/transition/ViewOverlayApi14;->zzt()Lcom/google/android/gms/measurement/internal/zzy; HPLandroidx/transition/ViewOverlayApi14;->zzu()Lcom/google/firebase/auth/internal/zzaf; HPLandroidx/viewpager/widget/ViewPager$MyAccessibilityDelegate;->onInitializeAccessibilityNodeInfo(Landroid/view/View;Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat;)V HPLcom/airbnb/lottie/parser/IntegerParser;->zza()Ljava/lang/Object; HPLcom/airbnb/lottie/parser/PathParser;->zza()Ljava/lang/Object; HPLcom/airbnb/lottie/parser/PointFParser;->zza()Ljava/lang/Object; HPLcom/airbnb/lottie/parser/ScaleXYParser;->zza()Ljava/lang/Object; HPLcom/airbnb/lottie/parser/ShapeDataParser;->zza()Ljava/lang/Object; HPLcom/bumptech/glide/load/engine/DecodeHelper;->getLoadPath(Ljava/lang/Class;)Lcom/bumptech/glide/load/engine/LoadPath; HPLcom/bumptech/glide/request/BaseRequestOptions;->apply(Lcom/bumptech/glide/request/BaseRequestOptions;)Lcom/bumptech/glide/request/BaseRequestOptions; HPLcom/google/android/flexbox/FlexLine;->()V HPLcom/google/android/flexbox/FlexLine;->getItemCountNotGone()I HPLcom/google/android/flexbox/FlexboxHelper;->addFlexLine(Ljava/util/List;Lcom/google/android/flexbox/FlexLine;II)V HPLcom/google/android/flexbox/FlexboxHelper;->checkSizeConstraints(Landroid/view/View;I)V HPLcom/google/android/flexbox/FlexboxHelper;->clearFlexLines(Ljava/util/List;I)V HPLcom/google/android/flexbox/FlexboxHelper;->determineMainSize(III)V HPLcom/google/android/flexbox/FlexboxHelper;->ensureIndexToFlexLine(I)V HPLcom/google/android/flexbox/FlexboxHelper;->ensureMeasureSpecCache(I)V HPLcom/google/android/flexbox/FlexboxHelper;->ensureMeasuredSizeCache(I)V HPLcom/google/android/flexbox/FlexboxHelper;->getChildHeightMeasureSpecInternal(ILcom/google/android/flexbox/FlexItem;I)I HPLcom/google/android/flexbox/FlexboxHelper;->getFlexItemMarginEndCross(Lcom/google/android/flexbox/FlexItem;Z)I HPLcom/google/android/flexbox/FlexboxHelper;->getFlexItemMarginEndMain(Lcom/google/android/flexbox/FlexItem;Z)I HPLcom/google/android/flexbox/FlexboxHelper;->getFlexItemMarginStartMain(Lcom/google/android/flexbox/FlexItem;Z)I HPLcom/google/android/flexbox/FlexboxHelper;->layoutSingleChildHorizontal(Landroid/view/View;Lcom/google/android/flexbox/FlexLine;IIII)V HPLcom/google/android/flexbox/FlexboxHelper;->shrinkFlexItems(IILcom/google/android/flexbox/FlexLine;IIZ)V HPLcom/google/android/flexbox/FlexboxHelper;->stretchViewVertically(Landroid/view/View;II)V HPLcom/google/android/flexbox/FlexboxHelper;->stretchViews(I)V HPLcom/google/android/flexbox/FlexboxHelper;->updateMeasureCache(IIILandroid/view/View;)V HPLcom/google/android/flexbox/FlexboxLayoutManager$AnchorInfo;->access$1600(Lcom/google/android/flexbox/FlexboxLayoutManager$AnchorInfo;)V HPLcom/google/android/flexbox/FlexboxLayoutManager$AnchorInfo;->access$800(Lcom/google/android/flexbox/FlexboxLayoutManager$AnchorInfo;)V HPLcom/google/android/flexbox/FlexboxLayoutManager$LayoutParams;->(Landroid/content/Context;Landroid/util/AttributeSet;)V HPLcom/google/android/flexbox/FlexboxLayoutManager$LayoutParams;->getAlignSelf()I HPLcom/google/android/flexbox/FlexboxLayoutManager$LayoutParams;->getFlexBasisPercent()F HPLcom/google/android/flexbox/FlexboxLayoutManager$LayoutParams;->getFlexGrow()F HPLcom/google/android/flexbox/FlexboxLayoutManager$LayoutParams;->getFlexShrink()F HPLcom/google/android/flexbox/FlexboxLayoutManager$LayoutParams;->getHeight()I HPLcom/google/android/flexbox/FlexboxLayoutManager$LayoutParams;->getMarginBottom()I HPLcom/google/android/flexbox/FlexboxLayoutManager$LayoutParams;->getMarginLeft()I HPLcom/google/android/flexbox/FlexboxLayoutManager$LayoutParams;->getMarginRight()I HPLcom/google/android/flexbox/FlexboxLayoutManager$LayoutParams;->getMarginTop()I HPLcom/google/android/flexbox/FlexboxLayoutManager$LayoutParams;->getMaxHeight()I HPLcom/google/android/flexbox/FlexboxLayoutManager$LayoutParams;->getMaxWidth()I HPLcom/google/android/flexbox/FlexboxLayoutManager$LayoutParams;->getMinHeight()I HPLcom/google/android/flexbox/FlexboxLayoutManager$LayoutParams;->getMinWidth()I HPLcom/google/android/flexbox/FlexboxLayoutManager$LayoutParams;->getWidth()I HPLcom/google/android/flexbox/FlexboxLayoutManager$LayoutParams;->isWrapBefore()Z HPLcom/google/android/flexbox/FlexboxLayoutManager;->(Landroid/content/Context;)V HPLcom/google/android/flexbox/FlexboxLayoutManager;->canScrollHorizontally()Z HPLcom/google/android/flexbox/FlexboxLayoutManager;->canScrollVertically()Z HPLcom/google/android/flexbox/FlexboxLayoutManager;->checkLayoutParams(Landroidx/recyclerview/widget/RecyclerView$LayoutParams;)Z HPLcom/google/android/flexbox/FlexboxLayoutManager;->computeScrollExtent(Landroidx/recyclerview/widget/RecyclerView$State;)I HPLcom/google/android/flexbox/FlexboxLayoutManager;->computeScrollOffset(Landroidx/recyclerview/widget/RecyclerView$State;)I HPLcom/google/android/flexbox/FlexboxLayoutManager;->computeScrollRange(Landroidx/recyclerview/widget/RecyclerView$State;)I HPLcom/google/android/flexbox/FlexboxLayoutManager;->ensureOrientationHelper()V HPLcom/google/android/flexbox/FlexboxLayoutManager;->fill(Landroidx/recyclerview/widget/RecyclerView$Recycler;Landroidx/recyclerview/widget/RecyclerView$State;Lcom/google/android/flexbox/FlexboxLayoutManager$LayoutState;)I HPLcom/google/android/flexbox/FlexboxLayoutManager;->findFirstReferenceChild(I)Landroid/view/View; HPLcom/google/android/flexbox/FlexboxLayoutManager;->findFirstReferenceViewInLine(Landroid/view/View;Lcom/google/android/flexbox/FlexLine;)Landroid/view/View; HPLcom/google/android/flexbox/FlexboxLayoutManager;->findLastReferenceViewInLine(Landroid/view/View;Lcom/google/android/flexbox/FlexLine;)Landroid/view/View; HPLcom/google/android/flexbox/FlexboxLayoutManager;->findOneVisibleChild(IIZ)Landroid/view/View; HPLcom/google/android/flexbox/FlexboxLayoutManager;->findReferenceChild(III)Landroid/view/View; HPLcom/google/android/flexbox/FlexboxLayoutManager;->fixLayoutEndGap(ILandroidx/recyclerview/widget/RecyclerView$Recycler;Landroidx/recyclerview/widget/RecyclerView$State;Z)I HPLcom/google/android/flexbox/FlexboxLayoutManager;->fixLayoutStartGap(ILandroidx/recyclerview/widget/RecyclerView$Recycler;Landroidx/recyclerview/widget/RecyclerView$State;Z)I HPLcom/google/android/flexbox/FlexboxLayoutManager;->getAlignItems()I HPLcom/google/android/flexbox/FlexboxLayoutManager;->getChildHeightMeasureSpec(III)I HPLcom/google/android/flexbox/FlexboxLayoutManager;->getChildWidthMeasureSpec(III)I HPLcom/google/android/flexbox/FlexboxLayoutManager;->getDecorationLengthCrossAxis(Landroid/view/View;)I HPLcom/google/android/flexbox/FlexboxLayoutManager;->getDecorationLengthMainAxis(Landroid/view/View;II)I HPLcom/google/android/flexbox/FlexboxLayoutManager;->getFlexDirection()I HPLcom/google/android/flexbox/FlexboxLayoutManager;->getFlexItemAt(I)Landroid/view/View; HPLcom/google/android/flexbox/FlexboxLayoutManager;->getFlexItemCount()I HPLcom/google/android/flexbox/FlexboxLayoutManager;->getFlexLinesInternal()Ljava/util/List; HPLcom/google/android/flexbox/FlexboxLayoutManager;->getFlexWrap()I HPLcom/google/android/flexbox/FlexboxLayoutManager;->getLargestMainSize()I HPLcom/google/android/flexbox/FlexboxLayoutManager;->getMaxLine()I HPLcom/google/android/flexbox/FlexboxLayoutManager;->getReorderedFlexItemAt(I)Landroid/view/View; HPLcom/google/android/flexbox/FlexboxLayoutManager;->isMainAxisDirectionHorizontal()Z HPLcom/google/android/flexbox/FlexboxLayoutManager;->isMeasurementUpToDate(III)Z HPLcom/google/android/flexbox/FlexboxLayoutManager;->onAttachedToWindow(Landroidx/recyclerview/widget/RecyclerView;)V HPLcom/google/android/flexbox/FlexboxLayoutManager;->onDetachedFromWindow(Landroidx/recyclerview/widget/RecyclerView;Landroidx/recyclerview/widget/RecyclerView$Recycler;)V HPLcom/google/android/flexbox/FlexboxLayoutManager;->onLayoutChildren(Landroidx/recyclerview/widget/RecyclerView$Recycler;Landroidx/recyclerview/widget/RecyclerView$State;)V HPLcom/google/android/flexbox/FlexboxLayoutManager;->onLayoutCompleted(Landroidx/recyclerview/widget/RecyclerView$State;)V HPLcom/google/android/flexbox/FlexboxLayoutManager;->onNewFlexItemAdded(Landroid/view/View;IILcom/google/android/flexbox/FlexLine;)V HPLcom/google/android/flexbox/FlexboxLayoutManager;->resolveInfiniteAmount()V HPLcom/google/android/flexbox/FlexboxLayoutManager;->shouldMeasureChild(Landroid/view/View;IILandroidx/recyclerview/widget/RecyclerView$LayoutParams;)Z HPLcom/google/android/flexbox/FlexboxLayoutManager;->updateLayoutStateToFillEnd(Lcom/google/android/flexbox/FlexboxLayoutManager$AnchorInfo;ZZ)V HPLcom/google/android/flexbox/FlexboxLayoutManager;->updateLayoutStateToFillStart(Lcom/google/android/flexbox/FlexboxLayoutManager$AnchorInfo;ZZ)V HPLcom/google/android/flexbox/FlexboxLayoutManager;->updateViewCache(ILandroid/view/View;)V HPLcom/google/android/gms/common/util/concurrent/zza;->(Ljava/lang/Object;II)V HPLcom/google/android/gms/common/util/concurrent/zza;->run()V HPLcom/google/android/gms/common/wrappers/Wrappers;->packageManager(Landroid/content/Context;)Lcom/bumptech/glide/load/model/MediaStoreFileLoader$Factory; HPLcom/google/android/gms/internal/measurement/zzbs$zzg;->()V HPLcom/google/android/gms/internal/measurement/zzbs$zzg;->zza(Lcom/google/android/gms/internal/measurement/zzbs$zzg;Lcom/google/android/gms/internal/measurement/zzbs$zzk;)V HPLcom/google/android/gms/internal/measurement/zzbs$zzg;->zzbu()V HPLcom/google/android/gms/internal/measurement/zzbs$zzk$zza;->zza(Ljava/lang/String;)Lcom/google/android/gms/internal/measurement/zzbs$zzk$zza; HPLcom/google/android/gms/internal/measurement/zzbs$zzk;->zza(ILjava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLcom/google/android/gms/internal/measurement/zzcn;->zzc()Ljava/lang/Object; HPLcom/google/android/gms/internal/measurement/zzdd;->zza()Ljava/lang/Object; HPLcom/google/android/gms/internal/measurement/zzdm;->()V HPLcom/google/android/gms/internal/measurement/zzdp;->zza()Z HPLcom/google/android/gms/internal/measurement/zzel$zza;->zza(J)V HPLcom/google/android/gms/internal/measurement/zzel$zza;->zza(Ljava/lang/String;)V HPLcom/google/android/gms/internal/measurement/zzel$zza;->zzb(I)V HPLcom/google/android/gms/internal/measurement/zzfe$zza;->(Lcom/google/android/gms/internal/measurement/zzfe;)V HPLcom/google/android/gms/internal/measurement/zzfe$zza;->zzu()Lcom/google/android/gms/internal/measurement/zzgm; HPLcom/google/android/gms/internal/measurement/zzfe$zza;->zzv()Lcom/google/android/gms/internal/measurement/zzgm; HPLcom/google/android/gms/internal/measurement/zzfe;->()V HPLcom/google/android/gms/internal/measurement/zzgq;->zza(ILjava/lang/Object;Landroidx/compose/runtime/Stack;)V HPLcom/google/android/gms/internal/measurement/zzgq;->zzb(Ljava/lang/Object;)I HPLcom/google/android/gms/internal/measurement/zzgq;->zzb(Ljava/lang/Object;Landroidx/compose/runtime/Stack;)V HPLcom/google/android/gms/internal/measurement/zzgq;->zzc(Ljava/lang/Object;)V HPLcom/google/android/gms/internal/measurement/zzha;->add(Ljava/lang/Object;)Z HPLcom/google/android/gms/internal/measurement/zzhb;->zza(Ljava/lang/Class;)Lcom/google/android/gms/internal/measurement/zzhf; HPLcom/google/android/gms/internal/measurement/zzif;->zza(Ljava/lang/CharSequence;)I HPLcom/google/android/gms/internal/measurement/zzig;->zza(Ljava/lang/CharSequence;[BII)I HPLcom/google/android/gms/internal/measurement/zzit;->zza()Ljava/lang/Object; HPLcom/google/android/gms/internal/measurement/zziu;->zza()Ljava/lang/Object; HPLcom/google/android/gms/internal/measurement/zziz;->zza()Ljava/lang/Object; HPLcom/google/android/gms/internal/measurement/zzja;->zza()Ljava/lang/Object; HPLcom/google/android/gms/internal/measurement/zzjf;->zza()Ljava/lang/Object; HPLcom/google/android/gms/internal/measurement/zzjg;->zza()Ljava/lang/Object; HPLcom/google/android/gms/internal/measurement/zzjl;->zza()Ljava/lang/Object; HPLcom/google/android/gms/internal/measurement/zzjm;->zza()Ljava/lang/Object; HPLcom/google/android/gms/internal/measurement/zzjm;->zzb()Z HPLcom/google/android/gms/internal/measurement/zzjr;->zza()Ljava/lang/Object; HPLcom/google/android/gms/internal/measurement/zzjs;->zza()Ljava/lang/Object; HPLcom/google/android/gms/internal/measurement/zzjx;->zza()Ljava/lang/Object; HPLcom/google/android/gms/internal/measurement/zzjy;->zza()Ljava/lang/Object; HPLcom/google/android/gms/internal/measurement/zzkd;->zza()Ljava/lang/Object; HPLcom/google/android/gms/internal/measurement/zzke;->zza()Ljava/lang/Object; HPLcom/google/android/gms/internal/measurement/zzkj;->zza()Ljava/lang/Object; HPLcom/google/android/gms/internal/measurement/zzkk;->zza()Ljava/lang/Object; HPLcom/google/android/gms/internal/measurement/zzkp;->zza()Ljava/lang/Object; HPLcom/google/android/gms/internal/measurement/zzkq;->zza()Ljava/lang/Object; HPLcom/google/android/gms/internal/measurement/zzkv;->zza()Ljava/lang/Object; HPLcom/google/android/gms/internal/measurement/zzkw;->zza()Ljava/lang/Object; HPLcom/google/android/gms/internal/measurement/zzlb;->zza()Ljava/lang/Object; HPLcom/google/android/gms/internal/measurement/zzlb;->zzb()Z HPLcom/google/android/gms/internal/measurement/zzlc;->zza()Ljava/lang/Object; HPLcom/google/android/gms/internal/measurement/zzlh;->zza()Ljava/lang/Object; HPLcom/google/android/gms/internal/measurement/zzli;->zza()Ljava/lang/Object; HPLcom/google/android/gms/internal/measurement/zzln;->zza()Ljava/lang/Object; HPLcom/google/android/gms/internal/measurement/zzlo;->zza()Ljava/lang/Object; HPLcom/google/android/gms/internal/measurement/zzlt;->zza()Ljava/lang/Object; HPLcom/google/android/gms/internal/measurement/zzlu;->zza()Ljava/lang/Object; HPLcom/google/android/gms/internal/measurement/zzlz;->zza()Ljava/lang/Object; HPLcom/google/android/gms/internal/measurement/zzma;->zza()Ljava/lang/Object; HPLcom/google/android/gms/internal/measurement/zzmf;->zza()Ljava/lang/Object; HPLcom/google/android/gms/internal/measurement/zzmg;->zza()Ljava/lang/Object; HPLcom/google/android/gms/internal/measurement/zzml;->zza()Ljava/lang/Object; HPLcom/google/android/gms/internal/measurement/zzmm;->zza()Ljava/lang/Object; HPLcom/google/android/gms/internal/measurement/zzmr;->zza()Ljava/lang/Object; HPLcom/google/android/gms/internal/measurement/zzms;->zza()Ljava/lang/Object; HPLcom/google/android/gms/internal/measurement/zzmx;->zza()Ljava/lang/Object; HPLcom/google/android/gms/internal/measurement/zzmy;->zza()Ljava/lang/Object; HPLcom/google/android/gms/internal/measurement/zznd;->zza()Ljava/lang/Object; HPLcom/google/android/gms/internal/vision/zzfc;->addPosition(II)V HPLcom/google/android/gms/internal/vision/zzfc;->collectPrefetchPositionsFromView(Landroidx/recyclerview/widget/RecyclerView;Z)V HPLcom/google/android/gms/internal/vision/zzfc;->lastPrefetchIncludedPosition(I)Z HPLcom/google/android/gms/internal/vision/zziu$zzd;->zza(Ljava/lang/Object;JI)V HPLcom/google/android/gms/measurement/internal/zzad;->c_()Landroid/database/sqlite/SQLiteDatabase; HPLcom/google/android/gms/measurement/internal/zzad;->zza(JLjava/lang/String;JZZZZZ)Lcom/google/android/gms/measurement/internal/zzac; HPLcom/google/android/gms/measurement/internal/zzad;->zza(Lcom/google/android/gms/measurement/internal/zzak;)V HPLcom/google/android/gms/measurement/internal/zzad;->zza(Lcom/google/android/gms/measurement/internal/zzal;JZ)Z HPLcom/google/android/gms/measurement/internal/zzad;->zza(Ljava/lang/String;)Ljava/util/List; HPLcom/google/android/gms/measurement/internal/zzad;->zza(Ljava/lang/String;Ljava/lang/String;)Lcom/google/android/gms/measurement/internal/zzak; HPLcom/google/android/gms/measurement/internal/zzad;->zza(Ljava/lang/String;[Ljava/lang/String;)Ljava/util/List; HPLcom/google/android/gms/measurement/internal/zzad;->zzb(Ljava/lang/String;)Lcom/google/android/gms/measurement/internal/zzf; HPLcom/google/android/gms/measurement/internal/zzae;->getWritableDatabase()Landroid/database/sqlite/SQLiteDatabase; HPLcom/google/android/gms/measurement/internal/zzae;->onOpen(Landroid/database/sqlite/SQLiteDatabase;)V HPLcom/google/android/gms/measurement/internal/zzag;->zza(J)V HPLcom/google/android/gms/measurement/internal/zzal;->(Lcom/google/android/gms/measurement/internal/zzfw;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;JJLandroid/os/Bundle;)V HPLcom/google/android/gms/measurement/internal/zzaq;->()V HPLcom/google/android/gms/measurement/internal/zzbb;->zza()Ljava/lang/Object; HPLcom/google/android/gms/measurement/internal/zzbd;->zza()Ljava/lang/Object; HPLcom/google/android/gms/measurement/internal/zzbe;->zza()Ljava/lang/Object; HPLcom/google/android/gms/measurement/internal/zzbf;->zza()Ljava/lang/Object; HPLcom/google/android/gms/measurement/internal/zzbg;->zza()Ljava/lang/Object; HPLcom/google/android/gms/measurement/internal/zzbh;->zza()Ljava/lang/Object; HPLcom/google/android/gms/measurement/internal/zzbi;->zza()Ljava/lang/Object; HPLcom/google/android/gms/measurement/internal/zzbj;->zza()Ljava/lang/Object; HPLcom/google/android/gms/measurement/internal/zzbk;->zza()Ljava/lang/Object; HPLcom/google/android/gms/measurement/internal/zzbl;->zza()Ljava/lang/Object; HPLcom/google/android/gms/measurement/internal/zzbm;->zza()Ljava/lang/Object; HPLcom/google/android/gms/measurement/internal/zzbn;->zza()Ljava/lang/Object; HPLcom/google/android/gms/measurement/internal/zzbo;->zza()Ljava/lang/Object; HPLcom/google/android/gms/measurement/internal/zzbp;->zza()Ljava/lang/Object; HPLcom/google/android/gms/measurement/internal/zzbq;->zza()Ljava/lang/Object; HPLcom/google/android/gms/measurement/internal/zzbr;->zza()Ljava/lang/Object; HPLcom/google/android/gms/measurement/internal/zzbs;->zza()Ljava/lang/Object; HPLcom/google/android/gms/measurement/internal/zzbt;->zza()Ljava/lang/Object; HPLcom/google/android/gms/measurement/internal/zzbu;->zza()Ljava/lang/Object; HPLcom/google/android/gms/measurement/internal/zzbv;->zza()Ljava/lang/Object; HPLcom/google/android/gms/measurement/internal/zzbw;->zza()Ljava/lang/Object; HPLcom/google/android/gms/measurement/internal/zzbx;->zza()Ljava/lang/Object; HPLcom/google/android/gms/measurement/internal/zzby;->zza()Ljava/lang/Object; HPLcom/google/android/gms/measurement/internal/zzbz;->zza()Ljava/lang/Object; HPLcom/google/android/gms/measurement/internal/zzca;->zza()Ljava/lang/Object; HPLcom/google/android/gms/measurement/internal/zzcb;->zza()Ljava/lang/Object; HPLcom/google/android/gms/measurement/internal/zzcc;->zza()Ljava/lang/Object; HPLcom/google/android/gms/measurement/internal/zzcd;->zza()Ljava/lang/Object; HPLcom/google/android/gms/measurement/internal/zzce;->zza()Ljava/lang/Object; HPLcom/google/android/gms/measurement/internal/zzcf;->zza()Ljava/lang/Object; HPLcom/google/android/gms/measurement/internal/zzcg;->zza()Ljava/lang/Object; HPLcom/google/android/gms/measurement/internal/zzch;->zza()Ljava/lang/Object; HPLcom/google/android/gms/measurement/internal/zzci;->zza()Ljava/lang/Object; HPLcom/google/android/gms/measurement/internal/zzcj;->zza()Ljava/lang/Object; HPLcom/google/android/gms/measurement/internal/zzck;->zza()Ljava/lang/Object; HPLcom/google/android/gms/measurement/internal/zzcl;->zza()Ljava/lang/Object; HPLcom/google/android/gms/measurement/internal/zzcm;->zza()Ljava/lang/Object; HPLcom/google/android/gms/measurement/internal/zzcn;->zza()Ljava/lang/Object; HPLcom/google/android/gms/measurement/internal/zzco;->zza()Ljava/lang/Object; HPLcom/google/android/gms/measurement/internal/zzcp;->zza()Ljava/lang/Object; HPLcom/google/android/gms/measurement/internal/zzcq;->zza()Ljava/lang/Object; HPLcom/google/android/gms/measurement/internal/zzcr;->zza()Ljava/lang/Object; HPLcom/google/android/gms/measurement/internal/zzcs;->zza()Ljava/lang/Object; HPLcom/google/android/gms/measurement/internal/zzct;->zza()Ljava/lang/Object; HPLcom/google/android/gms/measurement/internal/zzcu;->zza()Ljava/lang/Object; HPLcom/google/android/gms/measurement/internal/zzcv;->zza()Ljava/lang/Object; HPLcom/google/android/gms/measurement/internal/zzcw;->zza()Ljava/lang/Object; HPLcom/google/android/gms/measurement/internal/zzcx;->zza()Ljava/lang/Object; HPLcom/google/android/gms/measurement/internal/zzcy;->zza()Ljava/lang/Object; HPLcom/google/android/gms/measurement/internal/zzcz;->zza()Ljava/lang/Object; HPLcom/google/android/gms/measurement/internal/zzd;->zzd()V HPLcom/google/android/gms/measurement/internal/zzda;->zza()Ljava/lang/Object; HPLcom/google/android/gms/measurement/internal/zzdb;->zza()Ljava/lang/Object; HPLcom/google/android/gms/measurement/internal/zzdc;->zza()Ljava/lang/Object; HPLcom/google/android/gms/measurement/internal/zzdd;->zza()Ljava/lang/Object; HPLcom/google/android/gms/measurement/internal/zzde;->zza()Ljava/lang/Object; HPLcom/google/android/gms/measurement/internal/zzdf;->zza()Ljava/lang/Object; HPLcom/google/android/gms/measurement/internal/zzdg;->zza()Ljava/lang/Object; HPLcom/google/android/gms/measurement/internal/zzdh;->zza()Ljava/lang/Object; HPLcom/google/android/gms/measurement/internal/zzdi;->zza()Ljava/lang/Object; HPLcom/google/android/gms/measurement/internal/zzdj;->zza()Ljava/lang/Object; HPLcom/google/android/gms/measurement/internal/zzdk;->zza()Ljava/lang/Object; HPLcom/google/android/gms/measurement/internal/zzdl;->zza()Ljava/lang/Object; HPLcom/google/android/gms/measurement/internal/zzdm;->zza()Ljava/lang/Object; HPLcom/google/android/gms/measurement/internal/zzdn;->zza()Ljava/lang/Object; HPLcom/google/android/gms/measurement/internal/zzdo;->zza()Ljava/lang/Object; HPLcom/google/android/gms/measurement/internal/zzdp;->zza()Ljava/lang/Object; HPLcom/google/android/gms/measurement/internal/zzdq;->zza()Ljava/lang/Object; HPLcom/google/android/gms/measurement/internal/zzdr;->zza()Ljava/lang/Object; HPLcom/google/android/gms/measurement/internal/zzds;->zza()Ljava/lang/Object; HPLcom/google/android/gms/measurement/internal/zzdt;->zza()Ljava/lang/Object; HPLcom/google/android/gms/measurement/internal/zzdu;->zza()Ljava/lang/Object; HPLcom/google/android/gms/measurement/internal/zzdv;->zza()Ljava/lang/Object; HPLcom/google/android/gms/measurement/internal/zzdw;->zza()Ljava/lang/Object; HPLcom/google/android/gms/measurement/internal/zzdx;->zza()Ljava/lang/Object; HPLcom/google/android/gms/measurement/internal/zzec;->zza()Ljava/lang/Object; HPLcom/google/android/gms/measurement/internal/zzel;->zza(Ljava/lang/Object;)Ljava/lang/Object; HPLcom/google/android/gms/measurement/internal/zzeo;->zza(I[B)Z HPLcom/google/android/gms/measurement/internal/zzes;->zzy()Ljava/lang/String; HPLcom/google/android/gms/measurement/internal/zzeu;->zza(Ljava/lang/String;)V HPLcom/google/android/gms/measurement/internal/zzf;->zzb(Ljava/lang/String;)V HPLcom/google/android/gms/measurement/internal/zzf;->zzc(Ljava/lang/String;)V HPLcom/google/android/gms/measurement/internal/zzfe;->zza(Ljava/lang/String;)Landroid/util/Pair; HPLcom/google/android/gms/measurement/internal/zzfe;->zzv()Ljava/lang/Boolean; HPLcom/google/android/gms/measurement/internal/zzfq;->zza(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; HPLcom/google/android/gms/measurement/internal/zzfq;->zzi(Ljava/lang/String;)V HPLcom/google/android/gms/measurement/internal/zzft;->zzd()V HPLcom/google/android/gms/measurement/internal/zzfw;->zzac()I HPLcom/google/android/gms/measurement/internal/zzfw;->zzb(Lcom/google/android/gms/measurement/internal/zzgq;)V HPLcom/google/android/gms/measurement/internal/zzfw;->zzc()Lcom/google/android/gms/measurement/internal/zzfe; HPLcom/google/android/gms/measurement/internal/zzfw;->zzi()Lcom/google/android/gms/measurement/internal/zzkm; HPLcom/google/android/gms/measurement/internal/zzfw;->zzq()Lcom/google/android/gms/measurement/internal/zzft; HPLcom/google/android/gms/measurement/internal/zzfw;->zzr()Lcom/google/android/gms/measurement/internal/zzes; HPLcom/google/android/gms/measurement/internal/zzgq;->zzz()Z HPLcom/google/android/gms/measurement/internal/zzhb;->zza(Ljava/lang/String;Ljava/lang/String;JLandroid/os/Bundle;ZZZLjava/lang/String;)V HPLcom/google/android/gms/measurement/internal/zzif;->zza(Lcom/google/android/gms/internal/measurement/zzbs$zze$zza;Ljava/lang/Object;)V HPLcom/google/android/gms/measurement/internal/zzif;->zza(Lcom/google/android/gms/internal/measurement/zzbs$zzk$zza;Ljava/lang/Object;)V HPLcom/google/android/gms/measurement/internal/zzil;->zza(Lcom/google/android/gms/measurement/internal/zzek;Lcom/google/android/gms/common/internal/safeparcel/AbstractSafeParcelable;Lcom/google/android/gms/measurement/internal/zzn;)V HPLcom/google/android/gms/measurement/internal/zzil;->zza(Z)Lcom/google/android/gms/measurement/internal/zzn; HPLcom/google/android/gms/measurement/internal/zzil;->zzaf()V HPLcom/google/android/gms/measurement/internal/zzka;->zza(Lcom/google/android/gms/measurement/internal/zzao;Lcom/google/android/gms/measurement/internal/zzn;)V HPLcom/google/android/gms/measurement/internal/zzka;->zzb(Lcom/google/android/gms/measurement/internal/zzao;Lcom/google/android/gms/measurement/internal/zzn;)V HPLcom/google/android/gms/measurement/internal/zzka;->zzb(Lcom/google/android/gms/measurement/internal/zzkb;)V HPLcom/google/android/gms/measurement/internal/zzka;->zzc(Lcom/google/android/gms/measurement/internal/zzn;)Lcom/google/android/gms/measurement/internal/zzf; HPLcom/google/android/gms/measurement/internal/zzka;->zze()Lcom/google/android/gms/measurement/internal/zzad; HPLcom/google/android/gms/measurement/internal/zzka;->zzh()Lcom/google/android/gms/measurement/internal/zzif; HPLcom/google/android/gms/measurement/internal/zzka;->zzz()V HPLcom/google/android/gms/measurement/internal/zzkm;->zza(ILjava/lang/Object;ZZ)Ljava/lang/Object; HPLcom/google/android/gms/measurement/internal/zzkm;->zza(Ljava/lang/String;Ljava/lang/String;ILjava/lang/Object;)Z HPLcom/google/android/gms/measurement/internal/zzkm;->zza(Ljava/lang/String;Ljava/lang/String;Landroid/os/Bundle;Ljava/util/List;ZZ)Landroid/os/Bundle; HPLcom/google/android/gms/measurement/internal/zzkm;->zza(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Object;Landroid/os/Bundle;Ljava/util/List;ZZ)I HPLcom/google/android/gms/measurement/internal/zzkm;->zzb(Ljava/lang/String;Ljava/lang/String;)Z HPLcom/google/android/gms/measurement/internal/zzkm;->zzc(Landroid/content/Context;Ljava/lang/String;)Z HPLcom/google/android/gms/measurement/internal/zzn;->(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;JLjava/lang/String;JJLjava/lang/String;ZZLjava/lang/String;JJIZZZLjava/lang/String;Ljava/lang/Boolean;JLjava/util/List;Ljava/lang/String;)V HPLcom/google/android/gms/measurement/internal/zzy;->zza(Lcom/google/android/gms/measurement/internal/zzel;)Z HPLcom/google/android/gms/measurement/internal/zzy;->zzd(Ljava/lang/String;)Ljava/lang/Boolean; HPLcom/google/android/gms/measurement/internal/zzy;->zzd(Ljava/lang/String;Lcom/google/android/gms/measurement/internal/zzel;)Z HPLcom/google/android/gms/measurement/internal/zzy;->zzz()Landroid/os/Bundle; HPLcom/google/android/gms/tasks/zzd;->run()V HPLcom/google/android/gms/tasks/zzr;->zza(Lcom/google/android/gms/tasks/Task;)V HPLcom/google/android/gms/tasks/zzr;->zza(Lcom/google/android/gms/tasks/zzq;)V HPLcom/google/android/material/appbar/AppBarLayout$BaseBehavior;->findFirstScrollingChild(Landroidx/coordinatorlayout/widget/CoordinatorLayout;)Landroid/view/View; HPLcom/google/android/material/appbar/AppBarLayout$BaseBehavior;->onLayoutChild(Landroidx/coordinatorlayout/widget/CoordinatorLayout;Landroid/view/View;I)Z HPLcom/google/android/material/appbar/AppBarLayout$BaseBehavior;->onMeasureChild(Landroidx/coordinatorlayout/widget/CoordinatorLayout;Landroid/view/View;IIII)Z HPLcom/google/android/material/appbar/AppBarLayout$BaseBehavior;->updateAccessibilityActions(Landroidx/coordinatorlayout/widget/CoordinatorLayout;Lcom/google/android/material/appbar/AppBarLayout;)V HPLcom/google/android/material/appbar/AppBarLayout$BaseBehavior;->updateAppBarLayoutDrawableState(Landroidx/coordinatorlayout/widget/CoordinatorLayout;Lcom/google/android/material/appbar/AppBarLayout;IIZ)V HPLcom/google/android/material/appbar/AppBarLayout$ScrollingViewBehavior;->findFirstDependency(Ljava/util/List;)Lcom/google/android/material/appbar/AppBarLayout; HPLcom/google/android/material/appbar/AppBarLayout$ScrollingViewBehavior;->layoutDependsOn(Landroidx/coordinatorlayout/widget/CoordinatorLayout;Landroid/view/View;Landroid/view/View;)Z HPLcom/google/android/material/appbar/AppBarLayout;->getTopInset()I HPLcom/google/android/material/appbar/AppBarLayout;->getTotalScrollRange()I HPLcom/google/android/material/appbar/AppBarLayout;->onLayout(ZIIII)V HPLcom/google/android/material/appbar/AppBarLayout;->onMeasure(II)V HPLcom/google/android/material/appbar/AppBarLayout;->shouldOffsetFirstChild()Z HPLcom/google/android/material/appbar/HeaderScrollingViewBehavior;->layoutChild(Landroidx/coordinatorlayout/widget/CoordinatorLayout;Landroid/view/View;I)V HPLcom/google/android/material/appbar/HeaderScrollingViewBehavior;->onMeasureChild(Landroidx/coordinatorlayout/widget/CoordinatorLayout;Landroid/view/View;IIII)Z HPLcom/google/android/material/appbar/ViewOffsetBehavior;->onLayoutChild(Landroidx/coordinatorlayout/widget/CoordinatorLayout;Landroid/view/View;I)Z HPLcom/google/android/material/appbar/ViewOffsetHelper;->applyOffsets()V HPLcom/google/android/material/bottomnavigation/BottomNavigationMenuView;->onMeasure(II)V HPLcom/google/android/material/button/MaterialButton;->(Landroid/content/Context;Landroid/util/AttributeSet;)V HPLcom/google/android/material/button/MaterialButtonHelper;->updateBackground()V HPLcom/google/android/material/internal/BaselineLayout;->onMeasure(II)V HPLcom/google/android/material/internal/CheckableImageButton;->onCreateDrawableState(I)[I HPLcom/google/android/material/internal/CheckableImageButton;->setChecked(Z)V HPLcom/google/android/material/navigation/NavigationBarItemView;->(Landroid/content/Context;)V HPLcom/google/android/material/navigation/NavigationBarItemView;->initialize(Landroidx/appcompat/view/menu/MenuItemImpl;I)V HPLcom/google/android/material/navigation/NavigationBarItemView;->onCreateDrawableState(I)[I HPLcom/google/android/material/navigation/NavigationBarItemView;->onInitializeAccessibilityNodeInfo(Landroid/view/accessibility/AccessibilityNodeInfo;)V HPLcom/google/android/material/navigation/NavigationBarItemView;->setChecked(Z)V HPLcom/google/android/material/navigation/NavigationBarItemView;->updateActiveIndicatorLayoutParams(I)V HPLcom/google/android/material/navigation/NavigationBarMenuView;->buildMenuView()V HPLcom/google/android/material/shadow/ShadowRenderer;->()V HPLcom/google/android/material/shadow/ShadowRenderer;->setShadowColor(I)V HPLcom/google/android/material/shape/MaterialShapeDrawable$MaterialShapeDrawableState;->(Lcom/google/android/material/shape/MaterialShapeDrawable$MaterialShapeDrawableState;)V HPLcom/google/android/material/shape/MaterialShapeDrawable$MaterialShapeDrawableState;->(Lcom/google/android/material/shape/ShapeAppearanceModel;Lcom/google/android/material/elevation/ElevationOverlayProvider;)V HPLcom/google/android/material/shape/MaterialShapeDrawable;->(Lcom/google/android/material/shape/MaterialShapeDrawable$MaterialShapeDrawableState;)V HPLcom/google/android/material/shape/MaterialShapeDrawable;->calculateTintFilter(Landroid/content/res/ColorStateList;Landroid/graphics/PorterDuff$Mode;Landroid/graphics/Paint;Z)Landroid/graphics/PorterDuffColorFilter; HPLcom/google/android/material/shape/MaterialShapeDrawable;->draw(Landroid/graphics/Canvas;)V HPLcom/google/android/material/shape/MaterialShapeDrawable;->drawShape(Landroid/graphics/Canvas;Landroid/graphics/Paint;Landroid/graphics/Path;Lcom/google/android/material/shape/ShapeAppearanceModel;Landroid/graphics/RectF;)V HPLcom/google/android/material/shape/MaterialShapeDrawable;->getBoundsAsRectF()Landroid/graphics/RectF; HPLcom/google/android/material/shape/MaterialShapeDrawable;->hasStroke()Z HPLcom/google/android/material/shape/MaterialShapeDrawable;->isRoundRect()Z HPLcom/google/android/material/shape/MaterialShapeDrawable;->isStateful()Z HPLcom/google/android/material/shape/MaterialShapeDrawable;->updateTintFilter()Z HPLcom/google/android/material/shape/ShapeAppearanceModel;->(Lcom/google/android/material/shape/ShapeAppearanceModel$Builder;Lkotlin/ResultKt;)V HPLcom/google/android/material/shape/ShapeAppearanceModel;->isRoundRect(Landroid/graphics/RectF;)Z HPLcom/google/android/material/shape/ShapeAppearancePathProvider;->calculatePath(Lcom/google/android/material/shape/ShapeAppearanceModel;FLandroid/graphics/RectF;Lio/grpc/Attributes$Key;Landroid/graphics/Path;)V HPLcom/google/android/material/shape/ShapeAppearancePathProvider;->pathOverlapsCorner(Landroid/graphics/Path;I)Z HPLcom/google/android/material/shape/ShapePath;->addArc(FFFFFF)V HPLcom/google/android/material/shape/ShapePath;->applyToPath(Landroid/graphics/Matrix;Landroid/graphics/Path;)V HPLcom/google/android/material/shape/ShapePath;->lineTo(FF)V HPLcom/google/android/material/shape/ShapePath;->reset(FFFF)V HPLcom/google/android/material/textview/MaterialTextView;->(Landroid/content/Context;Landroid/util/AttributeSet;)V HPLcom/google/android/material/textview/MaterialTextView;->applyLineHeightFromViewAppearance(Landroid/content/res/Resources$Theme;I)V HPLcom/google/android/material/textview/MaterialTextView;->readFirstAvailableDimension(Landroid/content/Context;Landroid/content/res/TypedArray;[I)I HPLcom/google/android/material/theme/MaterialComponentsViewInflater;->createTextView(Landroid/content/Context;Landroid/util/AttributeSet;)Landroidx/appcompat/widget/AppCompatTextView; HPLcom/google/ar/core/w;->run()V HPLcom/google/common/collect/Maps;->()V HPLcom/google/common/collect/Maps;->callbackFailAsync(ILandroid/os/Handler;)V HPLcom/google/common/collect/Maps;->getHandler(Landroid/os/Handler;)Landroid/os/Handler; HPLcom/google/common/collect/Maps;->resolve(Landroid/content/Context;I)Landroid/util/TypedValue; HPLcom/google/firebase/FirebaseApp;->checkNotDeleted()V HPLcom/google/firebase/FirebaseApp;->getPersistenceKey()Ljava/lang/String; HPLcom/google/firebase/auth/internal/zzaf;->zza()Z HPLcom/google/firebase/iid/FirebaseInstanceId;->getId()Ljava/lang/String; HPLcom/google/firebase/iid/FirebaseInstanceId;->zzl()Ljava/lang/String; HPLcom/google/firebase/iid/zzab;->(Lorg/threeten/bp/temporal/TemporalAccessor;Lorg/threeten/bp/format/DateTimeFormatter;)V HPLcom/google/firebase/iid/zzab;->getValue(Lorg/threeten/bp/temporal/TemporalField;)Ljava/lang/Long; HPLcom/google/firebase/iid/zzaq;->zza()Ljava/lang/Object; HPLcom/google/firebase/iid/zzar;->zza()Ljava/lang/Object; HPLcom/google/firebase/iid/zzaw;->(I)V HPLcom/google/firebase/iid/zzaw;->addNode(Ljava/lang/Object;)V HPLcom/google/firebase/iid/zzaw;->applySupportImageTint()V HPLcom/google/firebase/iid/zzaw;->burpActive()V HPLcom/google/firebase/iid/zzaw;->dfs(Ljava/lang/Object;Ljava/util/ArrayList;Ljava/util/HashSet;)V HPLcom/google/firebase/iid/zzaw;->getActiveFragmentStateManagers()Ljava/util/List; HPLcom/google/firebase/iid/zzaw;->getEmptyList()Ljava/util/ArrayList; HPLcom/google/firebase/iid/zzaw;->getFragments()Ljava/util/List; HPLcom/google/firebase/iid/zzaw;->loadFromAttributes(Landroid/util/AttributeSet;I)V HPLcom/google/firebase/iid/zzaw;->poolList(Ljava/util/ArrayList;)V HPLcom/google/firebase/iid/zzaw;->shouldApplyFrameworkTintUsingColorFilter()Z HPLcom/google/firebase/iid/zzf;->zza()Ljava/lang/Object; HPLcom/google/firebase/iid/zzh;->startUndispatchedOrReturn(Lkotlinx/coroutines/internal/ScopeCoroutine;Ljava/lang/Object;Lkotlin/jvm/functions/Function2;)Ljava/lang/Object; HPLcom/google/firebase/iid/zzk;->(Landroid/content/Context;Landroid/content/res/TypedArray;)V HPLcom/google/firebase/iid/zzk;->(Landroidx/constraintlayout/solver/widgets/ConstraintWidgetContainer;)V HPLcom/google/firebase/iid/zzk;->getDimensionPixelSize(II)I HPLcom/google/firebase/iid/zzk;->getFont(IILcom/google/common/collect/Maps;)Landroid/graphics/Typeface; HPLcom/google/firebase/iid/zzk;->getInt(II)I HPLcom/google/firebase/iid/zzk;->getResourceId(II)I HPLcom/google/firebase/iid/zzk;->getString(I)Ljava/lang/String; HPLcom/google/firebase/iid/zzk;->hasValue(I)Z HPLcom/google/firebase/iid/zzk;->measureChildren(Landroidx/constraintlayout/solver/widgets/ConstraintWidgetContainer;)V HPLcom/google/firebase/iid/zzk;->obtainStyledAttributes(Landroid/content/Context;Landroid/util/AttributeSet;[III)Lcom/google/firebase/iid/zzk; HPLcom/google/firebase/iid/zzk;->recycle()V HPLcom/google/firebase/iid/zzk;->solveLinearSystem(Landroidx/constraintlayout/solver/widgets/ConstraintWidgetContainer;II)V HPLcom/google/firebase/iid/zzv;->zza()Ljava/lang/Object; HPLcom/google/firebase/installations/FirebaseInstallations$$Lambda$2;->run()V HPLcom/google/firebase/installations/FirebaseInstallations;->preConditionChecks()V HPLcom/google/firebase/installations/FirebaseInstallations;->registerFidWithServer(Lcom/google/firebase/installations/local/AutoValue_PersistedInstallationEntry;)Lcom/google/firebase/installations/local/AutoValue_PersistedInstallationEntry; HPLcom/google/firebase/installations/local/AutoValue_PersistedInstallationEntry$Builder;->(Lcom/google/firebase/installations/local/AutoValue_PersistedInstallationEntry;Lcom/google/common/collect/Maps;)V HPLcom/google/firebase/installations/local/AutoValue_PersistedInstallationEntry$Builder;->build()Lcom/google/firebase/installations/local/AutoValue_PersistedInstallationEntry; HPLcom/google/firebase/installations/local/AutoValue_PersistedInstallationEntry;->(Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;JJLjava/lang/String;Lcom/google/common/collect/Maps;)V HPLcom/google/firebase/installations/remote/FirebaseInstallationServiceClient;->logFisCommunicationError(Ljava/net/HttpURLConnection;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V HPLcom/google/firebase/installations/remote/FirebaseInstallationServiceClient;->openHttpURLConnection(Ljava/net/URL;Ljava/lang/String;)Ljava/net/HttpURLConnection; HPLcom/google/firebase/messaging/zzl;->zza()Ljava/lang/Object; HPLcom/google/gson/Gson$3;->read(Lcom/google/gson/stream/JsonReader;)Lcom/google/gson/JsonElement; HPLcom/google/gson/Gson$3;->read(Lcom/google/gson/stream/JsonReader;)Ljava/lang/Object; HPLcom/google/gson/Gson;->(Lcom/google/gson/internal/Excluder;Lcom/google/gson/FieldNamingStrategy;Ljava/util/Map;ZZZZZZZLcom/google/gson/LongSerializationPolicy;Ljava/lang/String;IILjava/util/List;Ljava/util/List;Ljava/util/List;)V HPLcom/google/gson/Gson;->getAdapter(Lcom/google/gson/reflect/TypeToken;)Lcom/google/gson/TypeAdapter; HPLcom/google/gson/JsonArray;->()V HPLcom/google/gson/JsonArray;->iterator()Ljava/util/Iterator; HPLcom/google/gson/JsonElement;->()V HPLcom/google/gson/JsonElement;->getAsJsonArray()Lcom/google/gson/JsonArray; HPLcom/google/gson/JsonElement;->getAsJsonObject()Lcom/google/gson/JsonObject; HPLcom/google/gson/JsonObject;->()V HPLcom/google/gson/JsonObject;->get(Ljava/lang/String;)Lcom/google/gson/JsonElement; HPLcom/google/gson/JsonPrimitive;->(Ljava/lang/Boolean;)V HPLcom/google/gson/JsonPrimitive;->(Ljava/lang/Number;)V HPLcom/google/gson/JsonPrimitive;->(Ljava/lang/String;)V HPLcom/google/gson/JsonPrimitive;->getAsBoolean()Z HPLcom/google/gson/JsonPrimitive;->getAsLong()J HPLcom/google/gson/JsonPrimitive;->getAsNumber()Ljava/lang/Number; HPLcom/google/gson/JsonPrimitive;->getAsString()Ljava/lang/String; HPLcom/google/gson/internal/LazilyParsedNumber;->(Ljava/lang/String;)V HPLcom/google/gson/internal/LazilyParsedNumber;->longValue()J HPLcom/google/gson/internal/LinkedTreeMap$Node;->()V HPLcom/google/gson/internal/LinkedTreeMap$Node;->(Lcom/google/gson/internal/LinkedTreeMap$Node;Ljava/lang/Object;Lcom/google/gson/internal/LinkedTreeMap$Node;Lcom/google/gson/internal/LinkedTreeMap$Node;)V HPLcom/google/gson/internal/LinkedTreeMap;->()V HPLcom/google/gson/internal/LinkedTreeMap;->findByObject(Ljava/lang/Object;)Lcom/google/gson/internal/LinkedTreeMap$Node; HPLcom/google/gson/internal/LinkedTreeMap;->put(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLcom/google/gson/internal/LinkedTreeMap;->rebalance(Lcom/google/gson/internal/LinkedTreeMap$Node;Z)V HPLcom/google/gson/internal/LinkedTreeMap;->replaceInParent(Lcom/google/gson/internal/LinkedTreeMap$Node;Lcom/google/gson/internal/LinkedTreeMap$Node;)V HPLcom/google/gson/internal/LinkedTreeMap;->rotateLeft(Lcom/google/gson/internal/LinkedTreeMap$Node;)V HPLcom/google/gson/internal/bind/MapTypeAdapterFactory$Adapter;->read(Lcom/google/gson/stream/JsonReader;)Ljava/lang/Object; HPLcom/google/gson/internal/bind/ReflectiveTypeAdapterFactory;->create(Lcom/google/gson/Gson;Lcom/google/gson/reflect/TypeToken;)Lcom/google/gson/TypeAdapter; HPLcom/google/gson/internal/bind/TypeAdapterRuntimeTypeWrapper;->(Lcom/google/gson/Gson;Lcom/google/gson/TypeAdapter;Ljava/lang/reflect/Type;)V HPLcom/google/gson/internal/bind/TypeAdapterRuntimeTypeWrapper;->read(Lcom/google/gson/stream/JsonReader;)Ljava/lang/Object; HPLcom/google/gson/internal/bind/TypeAdapterRuntimeTypeWrapper;->write(Lcom/google/gson/stream/JsonWriter;Ljava/lang/Object;)V HPLcom/google/gson/reflect/TypeToken;->(Ljava/lang/reflect/Type;)V HPLcom/google/gson/reflect/TypeToken;->equals(Ljava/lang/Object;)Z HPLcom/google/gson/stream/JsonReader;->beginArray()V HPLcom/google/gson/stream/JsonReader;->beginObject()V HPLcom/google/gson/stream/JsonReader;->endArray()V HPLcom/google/gson/stream/JsonReader;->endObject()V HPLcom/google/gson/stream/JsonReader;->fillBuffer(I)Z HPLcom/google/gson/stream/JsonReader;->hasNext()Z HPLcom/google/gson/stream/JsonReader;->isLiteral(C)Z HPLcom/google/gson/stream/JsonReader;->nextBoolean()Z HPLcom/google/gson/stream/JsonReader;->nextName()Ljava/lang/String; HPLcom/google/gson/stream/JsonReader;->nextNonWhitespace(Z)I HPLcom/google/gson/stream/JsonReader;->nextString()Ljava/lang/String; HPLcom/google/gson/stream/JsonReader;->peek$enumunboxing$()I HPLcom/google/gson/stream/JsonReader;->push(I)V HPLcom/google/gson/stream/JsonReader;->readEscapeCharacter()C HPLcom/google/gson/stream/JsonWriter;->beforeValue()V HPLcom/google/gson/stream/JsonWriter;->peek()I HPLcom/google/gson/stream/JsonWriter;->string(Ljava/lang/String;)V HPLcom/google/samples/apps/iosched/DaggerMainApplication_HiltComponents_SingletonC$ActivityCImpl;->getHiltInternalFactoryFactory()Lcom/google/firebase/iid/zzk; HPLcom/google/samples/apps/iosched/DaggerMainApplication_HiltComponents_SingletonC$SwitchingProvider;->get()Ljava/lang/Object; HPLcom/google/samples/apps/iosched/DaggerMainApplication_HiltComponents_SingletonC$ViewModelCImpl;->(Lcom/google/samples/apps/iosched/DaggerMainApplication_HiltComponents_SingletonC;Lcom/google/samples/apps/iosched/DaggerMainApplication_HiltComponents_SingletonC$ActivityRetainedCImpl;Lio/grpc/Metadata$1;Landroidx/lifecycle/SavedStateHandle;Lcom/google/common/collect/Maps;)V HPLcom/google/samples/apps/iosched/DataBinderMapperImpl;->getDataBinder(Landroidx/databinding/DataBindingComponent;Landroid/view/View;I)Landroidx/databinding/ViewDataBinding; HPLcom/google/samples/apps/iosched/databinding/ItemInlineTagBindingImpl;->(Landroidx/databinding/DataBindingComponent;Landroid/view/View;)V HPLcom/google/samples/apps/iosched/databinding/ItemInlineTagBindingImpl;->executeBindings()V HPLcom/google/samples/apps/iosched/databinding/ItemInlineTagBindingImpl;->setTag(Lcom/google/samples/apps/iosched/model/Tag;)V HPLcom/google/samples/apps/iosched/databinding/ItemSessionBindingImpl;->(Landroidx/databinding/DataBindingComponent;Landroid/view/View;)V HPLcom/google/samples/apps/iosched/databinding/ItemSessionBindingImpl;->executeBindings()V HPLcom/google/samples/apps/iosched/databinding/ItemSessionBindingImpl;->hasPendingBindings()Z HPLcom/google/samples/apps/iosched/databinding/ItemSessionBindingImpl;->setUserSession(Lcom/google/samples/apps/iosched/model/userdata/UserSession;)V HPLcom/google/samples/apps/iosched/model/ConferenceDay;->contains(Lcom/google/samples/apps/iosched/model/Session;)Z HPLcom/google/samples/apps/iosched/model/ConferenceDay;->equals(Ljava/lang/Object;)Z HPLcom/google/samples/apps/iosched/model/ConferenceDay;->getStart()Lorg/threeten/bp/ZonedDateTime; HPLcom/google/samples/apps/iosched/model/Room;->getId()Ljava/lang/String; HPLcom/google/samples/apps/iosched/model/Room;->getName()Ljava/lang/String; HPLcom/google/samples/apps/iosched/model/Session$isReservable$2;->(Lcom/google/samples/apps/iosched/model/Session;)V HPLcom/google/samples/apps/iosched/model/Session$isReservable$2;->invoke()Ljava/lang/Object; HPLcom/google/samples/apps/iosched/model/Session$type$2;->(Lcom/google/samples/apps/iosched/model/Session;)V HPLcom/google/samples/apps/iosched/model/Session;->(Ljava/lang/String;Lorg/threeten/bp/ZonedDateTime;Lorg/threeten/bp/ZonedDateTime;Ljava/lang/String;Ljava/lang/String;Lcom/google/samples/apps/iosched/model/Room;Ljava/lang/String;ZLjava/lang/String;Ljava/lang/String;Ljava/util/List;Ljava/util/List;Ljava/util/Set;Ljava/lang/String;Ljava/util/Set;)V HPLcom/google/samples/apps/iosched/model/Session;->getDisplayTags()Ljava/util/List; HPLcom/google/samples/apps/iosched/model/Session;->getId()Ljava/lang/String; HPLcom/google/samples/apps/iosched/model/Session;->getRoom()Lcom/google/samples/apps/iosched/model/Room; HPLcom/google/samples/apps/iosched/model/Session;->getStartTime()Lorg/threeten/bp/ZonedDateTime; HPLcom/google/samples/apps/iosched/model/Session;->getTags()Ljava/util/List; HPLcom/google/samples/apps/iosched/model/Session;->getTitle()Ljava/lang/String; HPLcom/google/samples/apps/iosched/model/Session;->getType()Lcom/google/samples/apps/iosched/model/SessionType; HPLcom/google/samples/apps/iosched/model/Session;->isLivestream()Z HPLcom/google/samples/apps/iosched/model/Session;->isReservable()Z HPLcom/google/samples/apps/iosched/model/SessionType$Companion;->fromTags(Ljava/util/List;)Lcom/google/samples/apps/iosched/model/SessionType; HPLcom/google/samples/apps/iosched/model/Speaker;->hashCode()I HPLcom/google/samples/apps/iosched/model/Tag;->getCategory()Ljava/lang/String; HPLcom/google/samples/apps/iosched/model/Tag;->getTagName()Ljava/lang/String; HPLcom/google/samples/apps/iosched/model/schedule/PinnedSession;->(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;JLjava/lang/String;)V HPLcom/google/samples/apps/iosched/model/userdata/UserEvent;->(Ljava/lang/String;ZZLcom/google/samples/apps/iosched/model/userdata/UserEvent$ReservationStatus;Lcom/google/samples/apps/iosched/model/reservations/ReservationRequestResult;I)V HPLcom/google/samples/apps/iosched/model/userdata/UserEvent;->equals(Ljava/lang/Object;)Z HPLcom/google/samples/apps/iosched/model/userdata/UserEvent;->isReserved()Z HPLcom/google/samples/apps/iosched/model/userdata/UserEvent;->isStarred()Z HPLcom/google/samples/apps/iosched/model/userdata/UserSession;->(Lcom/google/samples/apps/iosched/model/Session;Lcom/google/samples/apps/iosched/model/userdata/UserEvent;)V HPLcom/google/samples/apps/iosched/model/userdata/UserSession;->getSession()Lcom/google/samples/apps/iosched/model/Session; HPLcom/google/samples/apps/iosched/model/userdata/UserSession;->getUserEvent()Lcom/google/samples/apps/iosched/model/userdata/UserEvent; HPLcom/google/samples/apps/iosched/shared/data/BootstrapConferenceDataSource;->getOfflineConferenceData()Lcom/google/samples/apps/iosched/model/ConferenceData; HPLcom/google/samples/apps/iosched/shared/data/ConferenceDataRepository;->populateSearchData(Lcom/google/samples/apps/iosched/model/ConferenceData;)V HPLcom/google/samples/apps/iosched/shared/data/FakeAppConfigDataSource;->initTimes(Lorg/threeten/bp/ZonedDateTime;Ljava/util/Map;)V HPLcom/google/samples/apps/iosched/shared/data/db/CodelabFtsDao_Impl$1;->bind(Landroidx/sqlite/db/SupportSQLiteStatement;Ljava/lang/Object;)V HPLcom/google/samples/apps/iosched/shared/data/db/SessionFtsEntity;->(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V HPLcom/google/samples/apps/iosched/shared/data/session/json/SessionTemp;->(Ljava/lang/String;Lorg/threeten/bp/ZonedDateTime;Lorg/threeten/bp/ZonedDateTime;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ZLjava/lang/String;Ljava/lang/String;Ljava/util/List;Ljava/util/Set;Ljava/lang/String;Ljava/util/Set;)V HPLcom/google/samples/apps/iosched/shared/data/session/json/TagDeserializer;->getUrlFromId(Ljava/lang/String;)Ljava/lang/String; HPLcom/google/samples/apps/iosched/shared/data/userevent/DefaultSessionAndUserEventRepository;->createDefaultUserEvent(Lcom/google/samples/apps/iosched/model/Session;)Lcom/google/samples/apps/iosched/model/userdata/UserEvent; HPLcom/google/samples/apps/iosched/shared/domain/sessions/LoadUserSessionUseCase;->buildConferenceDayIndexer(Ljava/util/List;)Landroidx/compose/runtime/SnapshotThreadLocal; HPLcom/google/samples/apps/iosched/shared/domain/sessions/NotificationAlarmUpdater$updateAll$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; HPLcom/google/samples/apps/iosched/shared/util/TimeUtils;->isConferenceTimeZone(Lorg/threeten/bp/ZoneId;)Z HPLcom/google/samples/apps/iosched/shared/util/TimeUtils;->zonedTime(Lorg/threeten/bp/ZonedDateTime;Lorg/threeten/bp/ZoneId;)Lorg/threeten/bp/ZonedDateTime; HPLcom/google/samples/apps/iosched/ui/reservation/ReservationTextView;->(Landroid/content/Context;Landroid/util/AttributeSet;)V HPLcom/google/samples/apps/iosched/ui/reservation/ReservationTextView;->onCreateDrawableState(I)[I HPLcom/google/samples/apps/iosched/ui/schedule/DayIndicatorAdapter;->getItemId(I)J HPLcom/google/samples/apps/iosched/ui/schedule/DaySeparatorItemDecoration;->(Landroid/content/Context;Landroidx/compose/runtime/SnapshotThreadLocal;Lorg/threeten/bp/ZoneId;)V HPLcom/google/samples/apps/iosched/ui/schedule/DaySeparatorItemDecoration;->getItemOffsets(Landroid/graphics/Rect;Landroid/view/View;Landroidx/recyclerview/widget/RecyclerView;Landroidx/recyclerview/widget/RecyclerView$State;)V HPLcom/google/samples/apps/iosched/ui/schedule/DaySeparatorItemDecoration;->onDraw(Landroid/graphics/Canvas;Landroidx/recyclerview/widget/RecyclerView;Landroidx/recyclerview/widget/RecyclerView$State;)V HPLcom/google/samples/apps/iosched/ui/schedule/ScheduleFragment$onViewCreated$5$1$1;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HPLcom/google/samples/apps/iosched/ui/schedule/ScheduleTimeHeadersDecoration;->drawHeader(Landroid/graphics/Canvas;Landroid/view/View;ILandroid/text/StaticLayout;FZ)V HPLcom/google/samples/apps/iosched/ui/schedule/ScheduleTimeHeadersDecoration;->onDrawOver(Landroid/graphics/Canvas;Landroidx/recyclerview/widget/RecyclerView;Landroidx/recyclerview/widget/RecyclerView$State;)V HPLcom/google/samples/apps/iosched/ui/sessioncommon/SessionDiff;->areItemsTheSame(Ljava/lang/Object;Ljava/lang/Object;)Z HPLcom/google/samples/apps/iosched/ui/sessioncommon/SessionsAdapter;->onBindViewHolder(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;I)V HPLcom/google/samples/apps/iosched/ui/sessioncommon/SessionsAdapter;->onCreateViewHolder(Landroid/view/ViewGroup;I)Landroidx/recyclerview/widget/RecyclerView$ViewHolder; HPLcom/google/samples/apps/iosched/ui/sessioncommon/TagAdapter;->getItemCount()I HPLcom/google/samples/apps/iosched/ui/sessioncommon/TagAdapter;->onBindViewHolder(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;I)V HPLcom/google/samples/apps/iosched/ui/sessioncommon/TagAdapter;->onCreateViewHolder(Landroid/view/ViewGroup;I)Landroidx/recyclerview/widget/RecyclerView$ViewHolder; HPLcom/google/samples/apps/iosched/util/StatusBarScrimBehavior;->layoutDependsOn(Landroidx/coordinatorlayout/widget/CoordinatorLayout;Landroid/view/View;Landroid/view/View;)Z HPLcom/google/samples/apps/iosched/util/StatusBarScrimBehavior;->onLayoutChild(Landroidx/coordinatorlayout/widget/CoordinatorLayout;Landroid/view/View;I)Z HPLcom/google/samples/apps/iosched/widget/BubbleDecoration$$ExternalSyntheticLambda0;->onAnimationUpdate(Landroid/animation/ValueAnimator;)V HPLcom/google/samples/apps/iosched/widget/BubbleDecoration;->computeScalingRect(Landroid/graphics/RectF;F)V HPLcom/google/samples/apps/iosched/widget/BubbleDecoration;->onDraw(Landroid/graphics/Canvas;Landroidx/recyclerview/widget/RecyclerView;Landroidx/recyclerview/widget/RecyclerView$State;)V HPLcom/google/samples/apps/iosched/widget/CountdownView$1;->copyNodeInfoNoChildren(Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat;Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat;)V HPLcom/google/samples/apps/iosched/widget/CountdownView$1;->onInitializeAccessibilityNodeInfo(Landroid/view/View;Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat;)V HPLcom/google/samples/apps/iosched/widget/CountdownView$1;->onRequestSendAccessibilityEvent(Landroid/view/ViewGroup;Landroid/view/View;Landroid/view/accessibility/AccessibilityEvent;)Z HPLcom/google/samples/apps/iosched/widget/IoSlidingPaneLayout;->onMeasure(II)V HPLdagger/hilt/android/internal/lifecycle/HiltViewModelFactory$1;->create(Ljava/lang/String;Ljava/lang/Class;Landroidx/lifecycle/SavedStateHandle;)Landroidx/lifecycle/ViewModel; HPLdagger/hilt/android/internal/managers/ViewComponentManager$FragmentContextWrapper;->getSystemService(Ljava/lang/String;)Ljava/lang/Object; HPLdagger/internal/DoubleCheck;->get()Ljava/lang/Object; HPLio/grpc/Status;->beforeCheckcastToFunctionOfArity(Ljava/lang/Object;I)Ljava/lang/Object; HPLio/grpc/Status;->goneUnless(Landroid/view/View;Z)V HPLkotlin/LazyKt__LazyKt;->distinctUntilChanged(Lkotlinx/coroutines/flow/Flow;)Lkotlinx/coroutines/flow/Flow; HPLkotlin/LazyKt__LazyKt;->fold(Lkotlin/coroutines/CoroutineContext$Element;Ljava/lang/Object;Lkotlin/jvm/functions/Function2;)Ljava/lang/Object; HPLkotlin/LazyKt__LazyKt;->get(Lkotlin/coroutines/CoroutineContext$Element;Lkotlin/coroutines/CoroutineContext$Key;)Lkotlin/coroutines/CoroutineContext$Element; HPLkotlin/LazyKt__LazyKt;->launch$default(Lkotlinx/coroutines/CoroutineScope;Lkotlin/coroutines/CoroutineContext;ILkotlin/jvm/functions/Function2;ILjava/lang/Object;)Lkotlinx/coroutines/Job; HPLkotlin/LazyKt__LazyKt;->launch(Lkotlinx/coroutines/CoroutineScope;Lkotlin/coroutines/CoroutineContext;ILkotlin/jvm/functions/Function2;)Lkotlinx/coroutines/Job; HPLkotlin/LazyKt__LazyKt;->lazy(ILkotlin/jvm/functions/Function0;)Lkotlin/Lazy; HPLkotlin/LazyKt__LazyKt;->minusKey(Lkotlin/coroutines/CoroutineContext$Element;Lkotlin/coroutines/CoroutineContext$Key;)Lkotlin/coroutines/CoroutineContext; HPLkotlin/LazyKt__LazyKt;->startCoroutineCancellable$default(Lkotlin/jvm/functions/Function2;Ljava/lang/Object;Lkotlin/coroutines/Continuation;Lkotlin/jvm/functions/Function1;I)V HPLkotlin/LazyKt__LazyKt;->withContext(Lkotlin/coroutines/CoroutineContext;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HPLkotlin/Pair;->(Ljava/lang/Object;Ljava/lang/Object;)V HPLkotlin/Result$Failure;->(Ljava/lang/Throwable;)V HPLkotlin/Result;->exceptionOrNull-impl(Ljava/lang/Object;)Ljava/lang/Throwable; HPLkotlin/ResultKt;->compareValues(Ljava/lang/Comparable;Ljava/lang/Comparable;)I HPLkotlin/ResultKt;->createCoroutineUnintercepted(Lkotlin/jvm/functions/Function2;Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; HPLkotlin/ResultKt;->createFailure(Ljava/lang/Throwable;)Ljava/lang/Object; HPLkotlin/ResultKt;->delay(JLkotlin/coroutines/Continuation;)Ljava/lang/Object; HPLkotlin/ResultKt;->getListFromJsonArray(Lcom/google/gson/JsonObject;Ljava/lang/String;)Ljava/util/List; HPLkotlin/ResultKt;->invokeOnCompletion$default(Lkotlinx/coroutines/Job;ZZLkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lkotlinx/coroutines/DisposableHandle; HPLkotlin/ResultKt;->recoverResult(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HPLkotlin/ResultKt;->throwOnFailure(Ljava/lang/Object;)V HPLkotlin/ResultKt;->toState(Ljava/lang/Object;Lkotlin/jvm/functions/Function1;)Ljava/lang/Object; HPLkotlin/SafePublicationLazyImpl;->(Lkotlin/jvm/functions/Function0;)V HPLkotlin/TuplesKt;->()V HPLkotlin/TuplesKt;->checkExpressionValueIsNotNull(Ljava/lang/Object;Ljava/lang/String;)V HPLkotlin/TuplesKt;->checkNotNull(Ljava/lang/Object;)V HPLkotlin/TuplesKt;->checkNotNullExpressionValue(Ljava/lang/Object;Ljava/lang/String;)V HPLkotlin/TuplesKt;->checkNotNullParameter(Ljava/lang/Object;Ljava/lang/String;)V HPLkotlin/TuplesKt;->emitAllImpl$FlowKt__ChannelsKt(Lkotlinx/coroutines/flow/FlowCollector;Lkotlinx/coroutines/channels/ReceiveChannel;ZLkotlin/coroutines/Continuation;)Ljava/lang/Object; HPLkotlin/TuplesKt;->ensureActive(Lkotlin/coroutines/CoroutineContext;)V HPLkotlin/TuplesKt;->ensureActive(Lkotlinx/coroutines/Job;)V HPLkotlin/TuplesKt;->getLastIndex(Ljava/util/List;)I HPLkotlin/TuplesKt;->newCoroutineContext(Lkotlinx/coroutines/CoroutineScope;Lkotlin/coroutines/CoroutineContext;)Lkotlin/coroutines/CoroutineContext; HPLkotlin/TuplesKt;->produce(Lkotlinx/coroutines/CoroutineScope;Lkotlin/coroutines/CoroutineContext;ILkotlinx/coroutines/channels/BufferOverflow;ILkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function2;)Lkotlinx/coroutines/channels/ReceiveChannel; HPLkotlin/TuplesKt;->resume(Lkotlinx/coroutines/DispatchedTask;Lkotlin/coroutines/Continuation;Z)V HPLkotlin/TuplesKt;->stringPlus(Ljava/lang/String;Ljava/lang/Object;)Ljava/lang/String; HPLkotlin/TuplesKt;->topicTags(Landroidx/recyclerview/widget/RecyclerView;Ljava/util/List;)V HPLkotlin/collections/AbstractCollection;->()V HPLkotlin/collections/AbstractCollection;->size()I HPLkotlin/collections/AbstractList;->()V HPLkotlin/collections/AbstractList;->iterator()Ljava/util/Iterator; HPLkotlin/collections/ArrayDeque;->get(I)Ljava/lang/Object; HPLkotlin/collections/CollectionsKt__IteratorsJVMKt;->collectionSizeOrDefault(Ljava/lang/Iterable;I)I HPLkotlin/collections/CollectionsKt___CollectionsKt;->joinTo(Ljava/lang/Iterable;Ljava/lang/Appendable;Ljava/lang/CharSequence;Ljava/lang/CharSequence;Ljava/lang/CharSequence;ILjava/lang/CharSequence;Lkotlin/jvm/functions/Function1;)Ljava/lang/Appendable; HPLkotlin/collections/CollectionsKt___CollectionsKt;->joinToString$default(Ljava/lang/Iterable;Ljava/lang/CharSequence;Ljava/lang/CharSequence;Ljava/lang/CharSequence;ILjava/lang/CharSequence;Lkotlin/jvm/functions/Function1;I)Ljava/lang/String; HPLkotlin/collections/CollectionsKt___CollectionsKt;->reversed(Ljava/lang/Iterable;)Ljava/util/List; HPLkotlin/collections/CollectionsKt___CollectionsKt;->toCollection(Ljava/lang/Iterable;Ljava/util/Collection;)Ljava/util/Collection; HPLkotlin/collections/CollectionsKt___CollectionsKt;->toList(Ljava/lang/Iterable;)Ljava/util/List; HPLkotlin/collections/CollectionsKt___CollectionsKt;->toMutableList(Ljava/lang/Iterable;)Ljava/util/List; HPLkotlin/collections/CollectionsKt___CollectionsKt;->toMutableList(Ljava/util/Collection;)Ljava/util/List; HPLkotlin/collections/CollectionsKt___CollectionsKt;->toSet(Ljava/lang/Iterable;)Ljava/util/Set; HPLkotlin/collections/ReversedListReadOnly;->(Ljava/util/List;)V HPLkotlin/collections/ReversedListReadOnly;->get(I)Ljava/lang/Object; HPLkotlin/collections/ReversedListReadOnly;->getSize()I HPLkotlin/coroutines/AbstractCoroutineContextElement;->fold(Ljava/lang/Object;Lkotlin/jvm/functions/Function2;)Ljava/lang/Object; HPLkotlin/coroutines/CombinedContext;->(Lkotlin/coroutines/CoroutineContext;Lkotlin/coroutines/CoroutineContext$Element;)V HPLkotlin/coroutines/CombinedContext;->fold(Ljava/lang/Object;Lkotlin/jvm/functions/Function2;)Ljava/lang/Object; HPLkotlin/coroutines/CombinedContext;->get(Lkotlin/coroutines/CoroutineContext$Key;)Lkotlin/coroutines/CoroutineContext$Element; HPLkotlin/coroutines/CombinedContext;->minusKey(Lkotlin/coroutines/CoroutineContext$Key;)Lkotlin/coroutines/CoroutineContext; HPLkotlin/coroutines/CombinedContext;->plus(Lkotlin/coroutines/CoroutineContext;)Lkotlin/coroutines/CoroutineContext; HPLkotlin/coroutines/CoroutineContext$plus$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLkotlin/coroutines/CoroutineContext$plus$1;->invoke(Lkotlin/coroutines/CoroutineContext;Lkotlin/coroutines/CoroutineContext$Element;)Lkotlin/coroutines/CoroutineContext; HPLkotlin/coroutines/jvm/internal/BaseContinuationImpl;->(Lkotlin/coroutines/Continuation;)V HPLkotlin/coroutines/jvm/internal/BaseContinuationImpl;->resumeWith(Ljava/lang/Object;)V HPLkotlin/coroutines/jvm/internal/ContinuationImpl;->(Lkotlin/coroutines/Continuation;)V HPLkotlin/coroutines/jvm/internal/ContinuationImpl;->getContext()Lkotlin/coroutines/CoroutineContext; HPLkotlin/coroutines/jvm/internal/ContinuationImpl;->releaseIntercepted()V HPLkotlin/coroutines/jvm/internal/SuspendLambda;->(ILkotlin/coroutines/Continuation;)V HPLkotlin/coroutines/jvm/internal/SuspendLambda;->getArity()I HPLkotlin/jvm/internal/ArrayIterator;->(Lkotlin/collections/AbstractList;)V HPLkotlin/jvm/internal/ArrayIterator;->hasNext()Z HPLkotlin/jvm/internal/ArrayIterator;->next()Ljava/lang/Object; HPLkotlin/jvm/internal/Lambda;->(I)V HPLkotlin/ranges/IntProgression;->(III)V HPLkotlin/ranges/IntRange;->(II)V HPLkotlin/ranges/IntRange;->equals(Ljava/lang/Object;)Z HPLkotlin/ranges/IntRange;->isEmpty()Z HPLkotlin/text/StringsKt__StringsKt$rangesDelimitedBy$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLkotlinx/coroutines/AbstractCoroutine;->(Lkotlin/coroutines/CoroutineContext;ZZ)V HPLkotlinx/coroutines/AbstractCoroutine;->afterResume(Ljava/lang/Object;)V HPLkotlinx/coroutines/AbstractCoroutine;->getContext()Lkotlin/coroutines/CoroutineContext; HPLkotlinx/coroutines/AbstractCoroutine;->getCoroutineContext()Lkotlin/coroutines/CoroutineContext; HPLkotlinx/coroutines/AbstractCoroutine;->isActive()Z HPLkotlinx/coroutines/AbstractCoroutine;->onCompletionInternal(Ljava/lang/Object;)V HPLkotlinx/coroutines/AbstractCoroutine;->resumeWith(Ljava/lang/Object;)V HPLkotlinx/coroutines/AbstractCoroutine;->start$enumunboxing$(ILjava/lang/Object;Lkotlin/jvm/functions/Function2;)V HPLkotlinx/coroutines/BeforeResumeCancelHandler;->()V HPLkotlinx/coroutines/CancelHandler;->()V HPLkotlinx/coroutines/CancellableContinuationImpl;->(Lkotlin/coroutines/Continuation;I)V HPLkotlinx/coroutines/CancellableContinuationImpl;->cancel(Ljava/lang/Throwable;)Z HPLkotlinx/coroutines/CancellableContinuationImpl;->cancelCompletedResult$kotlinx_coroutines_core(Ljava/lang/Object;Ljava/lang/Throwable;)V HPLkotlinx/coroutines/CancellableContinuationImpl;->detachChild$kotlinx_coroutines_core()V HPLkotlinx/coroutines/CancellableContinuationImpl;->detachChildIfNonResuable()V HPLkotlinx/coroutines/CancellableContinuationImpl;->dispatchResume(I)V HPLkotlinx/coroutines/CancellableContinuationImpl;->getContinuationCancellationCause(Lkotlinx/coroutines/Job;)Ljava/lang/Throwable; HPLkotlinx/coroutines/CancellableContinuationImpl;->getDelegate$kotlinx_coroutines_core()Lkotlin/coroutines/Continuation; HPLkotlinx/coroutines/CancellableContinuationImpl;->getExceptionalResult$kotlinx_coroutines_core(Ljava/lang/Object;)Ljava/lang/Throwable; HPLkotlinx/coroutines/CancellableContinuationImpl;->getResult()Ljava/lang/Object; HPLkotlinx/coroutines/CancellableContinuationImpl;->getSuccessfulResult$kotlinx_coroutines_core(Ljava/lang/Object;)Ljava/lang/Object; HPLkotlinx/coroutines/CancellableContinuationImpl;->initCancellability()V HPLkotlinx/coroutines/CancellableContinuationImpl;->installParentHandle()Lkotlinx/coroutines/DisposableHandle; HPLkotlinx/coroutines/CancellableContinuationImpl;->invokeOnCancellation(Lkotlin/jvm/functions/Function1;)V HPLkotlinx/coroutines/CancellableContinuationImpl;->isReusable()Z HPLkotlinx/coroutines/CancellableContinuationImpl;->releaseClaimedReusableContinuation()V HPLkotlinx/coroutines/CancellableContinuationImpl;->resumeImpl(Ljava/lang/Object;ILkotlin/jvm/functions/Function1;)V HPLkotlinx/coroutines/CancellableContinuationImpl;->resumeWith(Ljava/lang/Object;)V HPLkotlinx/coroutines/CancellableContinuationImpl;->resumedState(Lkotlinx/coroutines/NotCompleted;Ljava/lang/Object;ILkotlin/jvm/functions/Function1;Ljava/lang/Object;)Ljava/lang/Object; HPLkotlinx/coroutines/CancellableContinuationImpl;->takeState$kotlinx_coroutines_core()Ljava/lang/Object; HPLkotlinx/coroutines/CancellableContinuationImpl;->tryResumeImpl(Ljava/lang/Object;Ljava/lang/Object;Lkotlin/jvm/functions/Function1;)Lkotlinx/coroutines/internal/Symbol; HPLkotlinx/coroutines/CancelledContinuation;->(Lkotlin/coroutines/Continuation;Ljava/lang/Throwable;Z)V HPLkotlinx/coroutines/ChildContinuation;->(Lkotlinx/coroutines/CancellableContinuationImpl;)V HPLkotlinx/coroutines/ChildContinuation;->invoke(Ljava/lang/Throwable;)V HPLkotlinx/coroutines/ChildHandleNode;->(Lkotlinx/coroutines/ChildJob;)V HPLkotlinx/coroutines/ChildHandleNode;->invoke(Ljava/lang/Throwable;)V HPLkotlinx/coroutines/CompletedContinuation;->(Ljava/lang/Object;Lkotlinx/coroutines/CancelHandler;Lkotlin/jvm/functions/Function1;Ljava/lang/Object;Ljava/lang/Throwable;I)V HPLkotlinx/coroutines/CompletedExceptionally;->(Ljava/lang/Throwable;Z)V HPLkotlinx/coroutines/CompletedExceptionally;->(Ljava/lang/Throwable;ZI)V HPLkotlinx/coroutines/CompletedExceptionally;->getHandled()Z HPLkotlinx/coroutines/CoroutineDispatcher$Key$1;->invoke(Lcom/google/samples/apps/iosched/model/userdata/UserSession;)Ljava/lang/Comparable; HPLkotlinx/coroutines/CoroutineDispatcher;->get(Lkotlin/coroutines/CoroutineContext$Key;)Lkotlin/coroutines/CoroutineContext$Element; HPLkotlinx/coroutines/CoroutineDispatcher;->isDispatchNeeded(Lkotlin/coroutines/CoroutineContext;)Z HPLkotlinx/coroutines/CoroutineDispatcher;->minusKey(Lkotlin/coroutines/CoroutineContext$Key;)Lkotlin/coroutines/CoroutineContext; HPLkotlinx/coroutines/DispatchedCoroutine;->afterResume(Ljava/lang/Object;)V HPLkotlinx/coroutines/DispatchedCoroutine;->getResult()Ljava/lang/Object; HPLkotlinx/coroutines/DispatchedTask;->(I)V HPLkotlinx/coroutines/DispatchedTask;->getExceptionalResult$kotlinx_coroutines_core(Ljava/lang/Object;)Ljava/lang/Throwable; HPLkotlinx/coroutines/Empty;->isActive()Z HPLkotlinx/coroutines/EventLoopImplPlatform;->decrementUseCount(Z)V HPLkotlinx/coroutines/EventLoopImplPlatform;->dispatchUnconfined(Lkotlinx/coroutines/DispatchedTask;)V HPLkotlinx/coroutines/EventLoopImplPlatform;->incrementUseCount(Z)V HPLkotlinx/coroutines/EventLoopImplPlatform;->isUnconfinedLoopActive()Z HPLkotlinx/coroutines/EventLoopImplPlatform;->processUnconfinedEvent()Z HPLkotlinx/coroutines/JobCancellingNode;->()V HPLkotlinx/coroutines/JobNode;->()V HPLkotlinx/coroutines/JobNode;->dispose()V HPLkotlinx/coroutines/JobNode;->getJob()Lkotlinx/coroutines/JobSupport; HPLkotlinx/coroutines/JobSupport$Finishing;->(Lkotlinx/coroutines/NodeList;ZLjava/lang/Throwable;)V HPLkotlinx/coroutines/JobSupport$Finishing;->addExceptionLocked(Ljava/lang/Throwable;)V HPLkotlinx/coroutines/JobSupport$Finishing;->allocateList()Ljava/util/ArrayList; HPLkotlinx/coroutines/JobSupport$Finishing;->getList()Lkotlinx/coroutines/NodeList; HPLkotlinx/coroutines/JobSupport$Finishing;->getRootCause()Ljava/lang/Throwable; HPLkotlinx/coroutines/JobSupport$Finishing;->isCancelling()Z HPLkotlinx/coroutines/JobSupport$Finishing;->isCompleting()Z HPLkotlinx/coroutines/JobSupport$Finishing;->sealLocked(Ljava/lang/Throwable;)Ljava/util/List; HPLkotlinx/coroutines/JobSupport$Finishing;->setCompleting(Z)V HPLkotlinx/coroutines/JobSupport$addLastAtomic$$inlined$addLastIf$1;->(Lkotlinx/coroutines/internal/LockFreeLinkedListNode;Lkotlinx/coroutines/JobSupport;Ljava/lang/Object;)V HPLkotlinx/coroutines/JobSupport$addLastAtomic$$inlined$addLastIf$1;->prepare(Ljava/lang/Object;)Ljava/lang/Object; HPLkotlinx/coroutines/JobSupport;->(Z)V HPLkotlinx/coroutines/JobSupport;->addLastAtomic(Ljava/lang/Object;Lkotlinx/coroutines/NodeList;Lkotlinx/coroutines/JobNode;)Z HPLkotlinx/coroutines/JobSupport;->cancel(Ljava/util/concurrent/CancellationException;)V HPLkotlinx/coroutines/JobSupport;->cancelImpl$kotlinx_coroutines_core(Ljava/lang/Object;)Z HPLkotlinx/coroutines/JobSupport;->cancelParent(Ljava/lang/Throwable;)Z HPLkotlinx/coroutines/JobSupport;->completeStateFinalization(Lkotlinx/coroutines/Incomplete;Ljava/lang/Object;)V HPLkotlinx/coroutines/JobSupport;->createCauseException(Ljava/lang/Object;)Ljava/lang/Throwable; HPLkotlinx/coroutines/JobSupport;->finalizeFinishingState(Lkotlinx/coroutines/JobSupport$Finishing;Ljava/lang/Object;)Ljava/lang/Object; HPLkotlinx/coroutines/JobSupport;->fold(Ljava/lang/Object;Lkotlin/jvm/functions/Function2;)Ljava/lang/Object; HPLkotlinx/coroutines/JobSupport;->get(Lkotlin/coroutines/CoroutineContext$Key;)Lkotlin/coroutines/CoroutineContext$Element; HPLkotlinx/coroutines/JobSupport;->getCancellationException()Ljava/util/concurrent/CancellationException; HPLkotlinx/coroutines/JobSupport;->getFinalRootCause(Lkotlinx/coroutines/JobSupport$Finishing;Ljava/util/List;)Ljava/lang/Throwable; HPLkotlinx/coroutines/JobSupport;->getKey()Lkotlin/coroutines/CoroutineContext$Key; HPLkotlinx/coroutines/JobSupport;->getOnCancelComplete$kotlinx_coroutines_core()Z HPLkotlinx/coroutines/JobSupport;->getOrPromoteCancellingList(Lkotlinx/coroutines/Incomplete;)Lkotlinx/coroutines/NodeList; HPLkotlinx/coroutines/JobSupport;->getState$kotlinx_coroutines_core()Ljava/lang/Object; HPLkotlinx/coroutines/JobSupport;->initParentJob(Lkotlinx/coroutines/Job;)V HPLkotlinx/coroutines/JobSupport;->isActive()Z HPLkotlinx/coroutines/JobSupport;->isScopedCoroutine()Z HPLkotlinx/coroutines/JobSupport;->join(Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HPLkotlinx/coroutines/JobSupport;->makeCompletingOnce$kotlinx_coroutines_core(Ljava/lang/Object;)Ljava/lang/Object; HPLkotlinx/coroutines/JobSupport;->minusKey(Lkotlin/coroutines/CoroutineContext$Key;)Lkotlin/coroutines/CoroutineContext; HPLkotlinx/coroutines/JobSupport;->nextChild(Lkotlinx/coroutines/internal/LockFreeLinkedListNode;)Lkotlinx/coroutines/ChildHandleNode; HPLkotlinx/coroutines/JobSupport;->notifyCancelling(Lkotlinx/coroutines/NodeList;Ljava/lang/Throwable;)V HPLkotlinx/coroutines/JobSupport;->promoteSingleToNodeList(Lkotlinx/coroutines/JobNode;)V HPLkotlinx/coroutines/JobSupport;->startInternal(Ljava/lang/Object;)I HPLkotlinx/coroutines/JobSupport;->toCancellationException(Ljava/lang/Throwable;Ljava/lang/String;)Ljava/util/concurrent/CancellationException; HPLkotlinx/coroutines/JobSupport;->tryMakeCompleting(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLkotlinx/coroutines/NodeList;->()V HPLkotlinx/coroutines/StandaloneCoroutine;->(Lkotlin/coroutines/CoroutineContext;Z)V HPLkotlinx/coroutines/ThreadLocalEventLoop;->getEventLoop$kotlinx_coroutines_core()Lkotlinx/coroutines/EventLoopImplPlatform; HPLkotlinx/coroutines/UndispatchedCoroutine;->(Lkotlin/coroutines/CoroutineContext;Lkotlin/coroutines/Continuation;)V HPLkotlinx/coroutines/UndispatchedCoroutine;->afterResume(Ljava/lang/Object;)V HPLkotlinx/coroutines/android/HandlerContext;->equals(Ljava/lang/Object;)Z HPLkotlinx/coroutines/android/HandlerContext;->isDispatchNeeded(Lkotlin/coroutines/CoroutineContext;)Z HPLkotlinx/coroutines/android/HandlerContext;->scheduleResumeAfterDelay(JLkotlinx/coroutines/CancellableContinuation;)V HPLkotlinx/coroutines/channels/AbstractChannel$ReceiveElement;->(Lkotlinx/coroutines/CancellableContinuation;I)V HPLkotlinx/coroutines/channels/AbstractChannel$ReceiveElement;->completeResumeReceive(Ljava/lang/Object;)V HPLkotlinx/coroutines/channels/AbstractChannel$ReceiveElement;->resumeReceiveClosed(Lkotlinx/coroutines/channels/Closed;)V HPLkotlinx/coroutines/channels/AbstractChannel$ReceiveElement;->tryResumeReceive(Ljava/lang/Object;Lkotlinx/coroutines/internal/LockFreeLinkedListNode$PrepareOp;)Lkotlinx/coroutines/internal/Symbol; HPLkotlinx/coroutines/channels/AbstractChannel$RemoveReceiveOnCancel;->(Lkotlinx/coroutines/channels/AbstractChannel;Lkotlinx/coroutines/channels/Receive;)V HPLkotlinx/coroutines/channels/AbstractChannel$receiveCatching$1;->(Lkotlinx/coroutines/channels/AbstractChannel;Lkotlin/coroutines/Continuation;)V HPLkotlinx/coroutines/channels/AbstractChannel$receiveCatching$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; HPLkotlinx/coroutines/channels/AbstractChannel;->enqueueReceiveInternal(Lkotlinx/coroutines/channels/Receive;)Z HPLkotlinx/coroutines/channels/AbstractChannel;->receiveCatching-JP2dKIU(Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HPLkotlinx/coroutines/channels/AbstractChannel;->receiveSuspend(ILkotlin/coroutines/Continuation;)Ljava/lang/Object; HPLkotlinx/coroutines/channels/AbstractChannel;->takeFirstReceiveOrPeekClosed()Lkotlinx/coroutines/channels/ReceiveOrClosed; HPLkotlinx/coroutines/channels/AbstractSendChannel$enqueueSend$$inlined$addLastIfPrevAndIf$1;->(Lkotlinx/coroutines/internal/LockFreeLinkedListNode;Lkotlinx/coroutines/channels/AbstractSendChannel;I)V HPLkotlinx/coroutines/channels/AbstractSendChannel$enqueueSend$$inlined$addLastIfPrevAndIf$1;->prepare()Ljava/lang/Object; HPLkotlinx/coroutines/channels/AbstractSendChannel$enqueueSend$$inlined$addLastIfPrevAndIf$1;->prepare(Ljava/lang/Object;)Ljava/lang/Object; HPLkotlinx/coroutines/channels/AbstractSendChannel;->(Lkotlin/jvm/functions/Function1;)V HPLkotlinx/coroutines/channels/AbstractSendChannel;->close(Ljava/lang/Throwable;)Z HPLkotlinx/coroutines/channels/AbstractSendChannel;->getClosedForSend()Lkotlinx/coroutines/channels/Closed; HPLkotlinx/coroutines/channels/AbstractSendChannel;->helpClose(Lkotlinx/coroutines/channels/Closed;)V HPLkotlinx/coroutines/channels/AbstractSendChannel;->send(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HPLkotlinx/coroutines/channels/AbstractSendChannel;->takeFirstReceiveOrPeekClosed()Lkotlinx/coroutines/channels/ReceiveOrClosed; HPLkotlinx/coroutines/channels/ArrayChannel;->(ILkotlinx/coroutines/channels/BufferOverflow;Lkotlin/jvm/functions/Function1;)V HPLkotlinx/coroutines/channels/ArrayChannel;->enqueueReceiveInternal(Lkotlinx/coroutines/channels/Receive;)Z HPLkotlinx/coroutines/channels/ArrayChannel;->offerInternal(Ljava/lang/Object;)Ljava/lang/Object; HPLkotlinx/coroutines/channels/ArrayChannel;->pollInternal()Ljava/lang/Object; HPLkotlinx/coroutines/channels/ChannelResult;->(Ljava/lang/Object;)V HPLkotlinx/coroutines/channels/ProducerCoroutine;->receiveCatching-JP2dKIU(Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HPLkotlinx/coroutines/channels/ProducerCoroutine;->send(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HPLkotlinx/coroutines/flow/DistinctFlowImpl$collect$2;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HPLkotlinx/coroutines/flow/DistinctFlowImpl;->collect(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HPLkotlinx/coroutines/flow/FlowKt__ChannelsKt$emitAllImpl$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; HPLkotlinx/coroutines/flow/FlowKt__LimitKt$dropWhile$$inlined$unsafeFlow$1;->collect(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HPLkotlinx/coroutines/flow/FlowKt__LimitKt$dropWhile$1$1;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HPLkotlinx/coroutines/flow/FlowKt__ShareKt$launchSharing$1$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLkotlinx/coroutines/flow/FlowKt__ShareKt$launchSharing$1$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; HPLkotlinx/coroutines/flow/FlowKt__ShareKt$launchSharing$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLkotlinx/coroutines/flow/FlowKt__ShareKt$launchSharing$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; HPLkotlinx/coroutines/flow/FlowKt__ZipKt$combine$1$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLkotlinx/coroutines/flow/FlowKt__ZipKt$combine$1$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; HPLkotlinx/coroutines/flow/ReadonlyStateFlow;->getValue()Ljava/lang/Object; HPLkotlinx/coroutines/flow/SafeFlow;->collect(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HPLkotlinx/coroutines/flow/SharedFlowImpl$collect$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; HPLkotlinx/coroutines/flow/SharedFlowImpl;->awaitValue(Lkotlinx/coroutines/flow/SharedFlowSlot;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HPLkotlinx/coroutines/flow/SharedFlowImpl;->cleanupTailLocked()V HPLkotlinx/coroutines/flow/SharedFlowImpl;->collect$suspendImpl(Lkotlinx/coroutines/flow/SharedFlowImpl;Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HPLkotlinx/coroutines/flow/SharedFlowImpl;->dropOldestLocked()V HPLkotlinx/coroutines/flow/SharedFlowImpl;->enqueueLocked(Ljava/lang/Object;)V HPLkotlinx/coroutines/flow/SharedFlowImpl;->findSlotsToResumeLocked([Lkotlin/coroutines/Continuation;)[Lkotlin/coroutines/Continuation; HPLkotlinx/coroutines/flow/SharedFlowImpl;->getBufferEndIndex()J HPLkotlinx/coroutines/flow/SharedFlowImpl;->getHead()J HPLkotlinx/coroutines/flow/SharedFlowImpl;->getLastReplayedLocked()Ljava/lang/Object; HPLkotlinx/coroutines/flow/SharedFlowImpl;->getTotalSize()I HPLkotlinx/coroutines/flow/SharedFlowImpl;->tryEmit(Ljava/lang/Object;)Z HPLkotlinx/coroutines/flow/SharedFlowImpl;->tryEmitLocked(Ljava/lang/Object;)Z HPLkotlinx/coroutines/flow/SharedFlowImpl;->tryPeekLocked(Lkotlinx/coroutines/flow/SharedFlowSlot;)J HPLkotlinx/coroutines/flow/SharedFlowImpl;->tryTakeValue(Lkotlinx/coroutines/flow/SharedFlowSlot;)Ljava/lang/Object; HPLkotlinx/coroutines/flow/SharedFlowImpl;->updateBufferLocked(JJJJ)V HPLkotlinx/coroutines/flow/SharedFlowImpl;->updateCollectorIndexLocked$kotlinx_coroutines_core(J)[Lkotlin/coroutines/Continuation; HPLkotlinx/coroutines/flow/StartedLazily$command$1$1;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HPLkotlinx/coroutines/flow/StartedWhileSubscribed$command$1;->(Lkotlinx/coroutines/flow/StartedWhileSubscribed;Lkotlin/coroutines/Continuation;)V HPLkotlinx/coroutines/flow/StartedWhileSubscribed$command$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLkotlinx/coroutines/flow/StartedWhileSubscribed$command$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; HPLkotlinx/coroutines/flow/StateFlowImpl$collect$1;->(Lkotlinx/coroutines/flow/StateFlowImpl;Lkotlin/coroutines/Continuation;)V HPLkotlinx/coroutines/flow/StateFlowImpl$collect$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; HPLkotlinx/coroutines/flow/StateFlowImpl;->collect(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HPLkotlinx/coroutines/flow/StateFlowImpl;->getValue()Ljava/lang/Object; HPLkotlinx/coroutines/flow/StateFlowImpl;->updateState(Ljava/lang/Object;Ljava/lang/Object;)Z HPLkotlinx/coroutines/flow/StateFlowSlot;->allocateLocked(Ljava/lang/Object;)Z HPLkotlinx/coroutines/flow/StateFlowSlot;->freeLocked(Ljava/lang/Object;)[Lkotlin/coroutines/Continuation; HPLkotlinx/coroutines/flow/internal/AbstractSharedFlow;->allocateSlot()Lkotlinx/coroutines/flow/internal/AbstractSharedFlowSlot; HPLkotlinx/coroutines/flow/internal/AbstractSharedFlow;->freeSlot(Lkotlinx/coroutines/flow/internal/AbstractSharedFlowSlot;)V HPLkotlinx/coroutines/flow/internal/ChannelFlow$collect$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLkotlinx/coroutines/flow/internal/ChannelFlow$collect$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; HPLkotlinx/coroutines/flow/internal/ChannelFlow$collectToFun$1;->(Lkotlinx/coroutines/flow/internal/ChannelFlow;Lkotlin/coroutines/Continuation;)V HPLkotlinx/coroutines/flow/internal/ChannelFlow$collectToFun$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; HPLkotlinx/coroutines/flow/internal/ChannelFlow$collectToFun$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; HPLkotlinx/coroutines/flow/internal/ChannelFlow;->(Lkotlin/coroutines/CoroutineContext;ILkotlinx/coroutines/channels/BufferOverflow;)V HPLkotlinx/coroutines/flow/internal/ChannelFlow;->collect(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HPLkotlinx/coroutines/flow/internal/ChannelFlow;->produceImpl(Lkotlinx/coroutines/CoroutineScope;)Lkotlinx/coroutines/channels/ReceiveChannel; HPLkotlinx/coroutines/flow/internal/ChannelFlowOperator;->collect(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HPLkotlinx/coroutines/flow/internal/ChannelFlowOperator;->collectTo(Lkotlinx/coroutines/channels/ProducerScope;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HPLkotlinx/coroutines/flow/internal/ChannelFlowTransformLatest$flowCollect$3$1$2;->(Lkotlinx/coroutines/flow/internal/ChannelFlowTransformLatest;Lkotlinx/coroutines/flow/FlowCollector;Ljava/lang/Object;Lkotlin/coroutines/Continuation;)V HPLkotlinx/coroutines/flow/internal/ChannelFlowTransformLatest$flowCollect$3$1$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLkotlinx/coroutines/flow/internal/ChannelFlowTransformLatest$flowCollect$3$1$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; HPLkotlinx/coroutines/flow/internal/ChannelFlowTransformLatest$flowCollect$3$1$emit$1;->(Lkotlinx/coroutines/flow/internal/ChannelFlowTransformLatest$flowCollect$3$1;Lkotlin/coroutines/Continuation;)V HPLkotlinx/coroutines/flow/internal/ChannelFlowTransformLatest$flowCollect$3$1;->(Lkotlin/jvm/internal/Ref$ObjectRef;Lkotlinx/coroutines/CoroutineScope;Lkotlinx/coroutines/flow/internal/ChannelFlowTransformLatest;Lkotlinx/coroutines/flow/FlowCollector;)V HPLkotlinx/coroutines/flow/internal/ChannelFlowTransformLatest$flowCollect$3$1;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HPLkotlinx/coroutines/flow/internal/ChannelFlowTransformLatest$flowCollect$3;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLkotlinx/coroutines/flow/internal/ChannelFlowTransformLatest$flowCollect$3;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; HPLkotlinx/coroutines/flow/internal/ChildCancelledException;->()V HPLkotlinx/coroutines/flow/internal/CombineKt$combineInternal$2$1$1;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HPLkotlinx/coroutines/flow/internal/CombineKt$combineInternal$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; HPLkotlinx/coroutines/flow/internal/SafeCollector;->(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/CoroutineContext;)V HPLkotlinx/coroutines/flow/internal/SafeCollector;->emit(Lkotlin/coroutines/Continuation;Ljava/lang/Object;)Ljava/lang/Object; HPLkotlinx/coroutines/flow/internal/SendingCollector;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HPLkotlinx/coroutines/flow/internal/SubscriptionCountStateFlow;->increment(I)Z HPLkotlinx/coroutines/internal/AtomicOp;->()V HPLkotlinx/coroutines/internal/AtomicOp;->perform(Ljava/lang/Object;)Ljava/lang/Object; HPLkotlinx/coroutines/internal/DispatchedContinuation;->(Lkotlinx/coroutines/CoroutineDispatcher;Lkotlin/coroutines/Continuation;)V HPLkotlinx/coroutines/internal/DispatchedContinuation;->claimReusableCancellableContinuation()Lkotlinx/coroutines/CancellableContinuationImpl; HPLkotlinx/coroutines/internal/DispatchedContinuation;->getContext()Lkotlin/coroutines/CoroutineContext; HPLkotlinx/coroutines/internal/DispatchedContinuation;->isReusable()Z HPLkotlinx/coroutines/internal/DispatchedContinuation;->release()V HPLkotlinx/coroutines/internal/DispatchedContinuation;->resumeWith(Ljava/lang/Object;)V HPLkotlinx/coroutines/internal/DispatchedContinuation;->takeState$kotlinx_coroutines_core()Ljava/lang/Object; HPLkotlinx/coroutines/internal/DispatchedContinuation;->tryReleaseClaimedContinuation(Lkotlinx/coroutines/CancellableContinuation;)Ljava/lang/Throwable; HPLkotlinx/coroutines/internal/LockFreeLinkedListHead;->()V HPLkotlinx/coroutines/internal/LockFreeLinkedListHead;->isRemoved()Z HPLkotlinx/coroutines/internal/LockFreeLinkedListNode$CondAddOp;->(Lkotlinx/coroutines/internal/LockFreeLinkedListNode;)V HPLkotlinx/coroutines/internal/LockFreeLinkedListNode$CondAddOp;->complete(Ljava/lang/Object;Ljava/lang/Object;)V HPLkotlinx/coroutines/internal/LockFreeLinkedListNode;->()V HPLkotlinx/coroutines/internal/LockFreeLinkedListNode;->addNext(Lkotlinx/coroutines/internal/LockFreeLinkedListNode;Lkotlinx/coroutines/internal/LockFreeLinkedListNode;)Z HPLkotlinx/coroutines/internal/LockFreeLinkedListNode;->finishAdd(Lkotlinx/coroutines/internal/LockFreeLinkedListNode;)V HPLkotlinx/coroutines/internal/LockFreeLinkedListNode;->getNext()Ljava/lang/Object; HPLkotlinx/coroutines/internal/LockFreeLinkedListNode;->getNextNode()Lkotlinx/coroutines/internal/LockFreeLinkedListNode; HPLkotlinx/coroutines/internal/LockFreeLinkedListNode;->getPrevNode()Lkotlinx/coroutines/internal/LockFreeLinkedListNode; HPLkotlinx/coroutines/internal/LockFreeLinkedListNode;->isRemoved()Z HPLkotlinx/coroutines/internal/LockFreeLinkedListNode;->remove()Z HPLkotlinx/coroutines/internal/LockFreeLinkedListNode;->tryCondAddNext(Lkotlinx/coroutines/internal/LockFreeLinkedListNode;Lkotlinx/coroutines/internal/LockFreeLinkedListNode;Lkotlinx/coroutines/internal/LockFreeLinkedListNode$CondAddOp;)I HPLkotlinx/coroutines/internal/LockFreeTaskQueue;->addLast(Ljava/lang/Object;)Z HPLkotlinx/coroutines/internal/LockFreeTaskQueue;->removeFirstOrNull()Ljava/lang/Object; HPLkotlinx/coroutines/internal/LockFreeTaskQueueCore;->addLast(Ljava/lang/Object;)I HPLkotlinx/coroutines/internal/LockFreeTaskQueueCore;->removeFirstOrNull()Ljava/lang/Object; HPLkotlinx/coroutines/internal/OpDescriptor;->()V HPLkotlinx/coroutines/internal/Removed;->(Lkotlinx/coroutines/internal/LockFreeLinkedListNode;)V HPLkotlinx/coroutines/internal/ScopeCoroutine;->(Lkotlin/coroutines/CoroutineContext;Lkotlin/coroutines/Continuation;)V HPLkotlinx/coroutines/internal/ThreadContextKt;->restoreThreadContext(Lkotlin/coroutines/CoroutineContext;Ljava/lang/Object;)V HPLkotlinx/coroutines/internal/ThreadContextKt;->threadContextElements(Lkotlin/coroutines/CoroutineContext;)Ljava/lang/Object; HPLkotlinx/coroutines/internal/ThreadContextKt;->updateThreadContext(Lkotlin/coroutines/CoroutineContext;Ljava/lang/Object;)Ljava/lang/Object; HPLkotlinx/coroutines/scheduling/CoroutineScheduler$Worker;->findTask(Z)Lkotlinx/coroutines/scheduling/Task; HPLkotlinx/coroutines/scheduling/CoroutineScheduler$Worker;->getIndexInArray()I HPLkotlinx/coroutines/scheduling/CoroutineScheduler$Worker;->getNextParkedWorker()Ljava/lang/Object; HPLkotlinx/coroutines/scheduling/CoroutineScheduler$Worker;->nextInt(I)I HPLkotlinx/coroutines/scheduling/CoroutineScheduler$Worker;->pollGlobalQueues()Lkotlinx/coroutines/scheduling/Task; HPLkotlinx/coroutines/scheduling/CoroutineScheduler$Worker;->run()V HPLkotlinx/coroutines/scheduling/CoroutineScheduler$Worker;->setNextParkedWorker(Ljava/lang/Object;)V HPLkotlinx/coroutines/scheduling/CoroutineScheduler$Worker;->tryReleaseCpu$enumunboxing$(I)Z HPLkotlinx/coroutines/scheduling/CoroutineScheduler$Worker;->trySteal(Z)Lkotlinx/coroutines/scheduling/Task; HPLkotlinx/coroutines/scheduling/CoroutineScheduler;->currentWorker()Lkotlinx/coroutines/scheduling/CoroutineScheduler$Worker; HPLkotlinx/coroutines/scheduling/CoroutineScheduler;->dispatch$default(Lkotlinx/coroutines/scheduling/CoroutineScheduler;Ljava/lang/Runnable;Lorg/threeten/bp/chrono/Chronology$1;ZI)V HPLkotlinx/coroutines/scheduling/CoroutineScheduler;->dispatch(Ljava/lang/Runnable;Lorg/threeten/bp/chrono/Chronology$1;Z)V HPLkotlinx/coroutines/scheduling/CoroutineScheduler;->isTerminated()Z HPLkotlinx/coroutines/scheduling/CoroutineScheduler;->parkedWorkersStackNextIndex(Lkotlinx/coroutines/scheduling/CoroutineScheduler$Worker;)I HPLkotlinx/coroutines/scheduling/CoroutineScheduler;->parkedWorkersStackPush(Lkotlinx/coroutines/scheduling/CoroutineScheduler$Worker;)Z HPLkotlinx/coroutines/scheduling/CoroutineScheduler;->signalCpuWork()V HPLkotlinx/coroutines/scheduling/CoroutineScheduler;->tryUnpark()Z HPLkotlinx/coroutines/scheduling/SchedulerCoroutineDispatcher;->dispatch(Lkotlin/coroutines/CoroutineContext;Ljava/lang/Runnable;)V HPLkotlinx/coroutines/scheduling/Task;->()V HPLkotlinx/coroutines/scheduling/WorkQueue;->add(Lkotlinx/coroutines/scheduling/Task;Z)Lkotlinx/coroutines/scheduling/Task; HPLkotlinx/coroutines/scheduling/WorkQueue;->poll()Lkotlinx/coroutines/scheduling/Task; HPLkotlinx/coroutines/scheduling/WorkQueue;->pollBuffer()Lkotlinx/coroutines/scheduling/Task; HPLkotlinx/coroutines/scheduling/WorkQueue;->tryStealLastScheduled(Lkotlinx/coroutines/scheduling/WorkQueue;Z)J HPLokhttp3/RequestBody;->zza(Landroid/database/sqlite/SQLiteDatabase;Ljava/lang/String;)Ljava/util/Set; HPLokhttp3/RequestBody;->zza(Lcom/google/android/gms/measurement/internal/zzes;Landroid/database/sqlite/SQLiteDatabase;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;)V HPLokhttp3/internal/connection/RouteSelector$Selection;->reset()V HPLokio/Base64;->methodFlagBitmapIndex(III)I HPLokio/Base64;->readUncompressedBody(Ljava/io/InputStream;Ljava/lang/String;I)[Landroidx/profileinstaller/DexProfileData; HPLokio/Base64;->setMethodBitmapBit([BIILandroidx/profileinstaller/DexProfileData;)V HPLokio/Base64;->transcodeAndWriteBody(Ljava/io/OutputStream;[B[Landroidx/profileinstaller/DexProfileData;)Z HPLokio/Base64;->writeMethodBitmap(Ljava/io/OutputStream;Landroidx/profileinstaller/DexProfileData;)V HPLokio/Base64;->writeMethodsWithInlineCaches(Ljava/io/OutputStream;Landroidx/profileinstaller/DexProfileData;)V HPLokio/SegmentPool;->compareInts(II)I HPLokio/SegmentPool;->compareLongs(JJ)I HPLokio/SegmentPool;->floorDiv(JJ)J HPLokio/SegmentPool;->floorMod(JI)I HPLokio/SegmentPool;->floorMod(JJ)J HPLokio/SegmentPool;->requireNonNull(Ljava/lang/Object;Ljava/lang/String;)Ljava/lang/Object; HPLokio/SegmentPool;->safeAdd(JJ)J HPLokio/SegmentPool;->safeMultiply(JI)J HPLokio/SegmentPool;->valueIterator(Landroidx/collection/SparseArrayCompat;)Ljava/util/Iterator; HPLokio/SegmentPool;->wrap(Landroid/content/Context;Landroid/util/AttributeSet;II)Landroid/content/Context; HPLorg/threeten/bp/Instant;->(JI)V HPLorg/threeten/bp/Instant;->create(JI)Lorg/threeten/bp/Instant; HPLorg/threeten/bp/Instant;->ofEpochMilli(J)Lorg/threeten/bp/Instant; HPLorg/threeten/bp/Instant;->ofEpochSecond(JJ)Lorg/threeten/bp/Instant; HPLorg/threeten/bp/Instant;->toEpochMilli()J HPLorg/threeten/bp/LocalDate;->(III)V HPLorg/threeten/bp/LocalDate;->compareTo0(Lorg/threeten/bp/LocalDate;)I HPLorg/threeten/bp/LocalDate;->equals(Ljava/lang/Object;)Z HPLorg/threeten/bp/LocalDate;->get0(Lorg/threeten/bp/temporal/TemporalField;)I HPLorg/threeten/bp/LocalDate;->getLong(Lorg/threeten/bp/temporal/TemporalField;)J HPLorg/threeten/bp/LocalDate;->hashCode()I HPLorg/threeten/bp/LocalDate;->plusDays(J)Lorg/threeten/bp/LocalDate; HPLorg/threeten/bp/LocalDateTime;->(Lorg/threeten/bp/LocalDate;Lorg/threeten/bp/LocalTime;)V HPLorg/threeten/bp/LocalDateTime;->compareTo(Lorg/threeten/bp/chrono/ChronoLocalDateTime;)I HPLorg/threeten/bp/LocalDateTime;->equals(Ljava/lang/Object;)Z HPLorg/threeten/bp/LocalDateTime;->getLong(Lorg/threeten/bp/temporal/TemporalField;)J HPLorg/threeten/bp/LocalDateTime;->hashCode()I HPLorg/threeten/bp/LocalDateTime;->plusWithOverflow(Lorg/threeten/bp/LocalDate;JJJJI)Lorg/threeten/bp/LocalDateTime; HPLorg/threeten/bp/LocalDateTime;->with(Lorg/threeten/bp/LocalDate;Lorg/threeten/bp/LocalTime;)Lorg/threeten/bp/LocalDateTime; HPLorg/threeten/bp/LocalTime;->(IIII)V HPLorg/threeten/bp/LocalTime;->compareTo(Lorg/threeten/bp/LocalTime;)I HPLorg/threeten/bp/LocalTime;->create(IIII)Lorg/threeten/bp/LocalTime; HPLorg/threeten/bp/LocalTime;->equals(Ljava/lang/Object;)Z HPLorg/threeten/bp/LocalTime;->get0(Lorg/threeten/bp/temporal/TemporalField;)I HPLorg/threeten/bp/LocalTime;->getLong(Lorg/threeten/bp/temporal/TemporalField;)J HPLorg/threeten/bp/LocalTime;->hashCode()I HPLorg/threeten/bp/LocalTime;->ofNanoOfDay(J)Lorg/threeten/bp/LocalTime; HPLorg/threeten/bp/LocalTime;->toNanoOfDay()J HPLorg/threeten/bp/LocalTime;->toSecondOfDay()I HPLorg/threeten/bp/ZoneId;->equals(Ljava/lang/Object;)Z HPLorg/threeten/bp/ZoneId;->hashCode()I HPLorg/threeten/bp/ZoneOffset;->equals(Ljava/lang/Object;)Z HPLorg/threeten/bp/ZoneOffset;->getId()Ljava/lang/String; HPLorg/threeten/bp/ZoneOffset;->getRules()Lorg/threeten/bp/zone/ZoneRules; HPLorg/threeten/bp/ZoneRegion;->getId()Ljava/lang/String; HPLorg/threeten/bp/ZoneRegion;->getRules()Lorg/threeten/bp/zone/ZoneRules; HPLorg/threeten/bp/ZonedDateTime;->(Lorg/threeten/bp/LocalDateTime;Lorg/threeten/bp/ZoneOffset;Lorg/threeten/bp/ZoneId;)V HPLorg/threeten/bp/ZonedDateTime;->getLong(Lorg/threeten/bp/temporal/TemporalField;)J HPLorg/threeten/bp/ZonedDateTime;->hashCode()I HPLorg/threeten/bp/ZonedDateTime;->ofInstant(Lorg/threeten/bp/Instant;Lorg/threeten/bp/ZoneId;)Lorg/threeten/bp/ZonedDateTime; HPLorg/threeten/bp/ZonedDateTime;->ofLocal(Lorg/threeten/bp/LocalDateTime;Lorg/threeten/bp/ZoneId;Lorg/threeten/bp/ZoneOffset;)Lorg/threeten/bp/ZonedDateTime; HPLorg/threeten/bp/chrono/ChronoLocalDate;->()V HPLorg/threeten/bp/chrono/ChronoLocalDateTime;->()V HPLorg/threeten/bp/chrono/ChronoLocalDateTime;->toEpochSecond(Lorg/threeten/bp/ZoneOffset;)J HPLorg/threeten/bp/chrono/ChronoZonedDateTime;->()V HPLorg/threeten/bp/chrono/ChronoZonedDateTime;->compareTo(Ljava/lang/Object;)I HPLorg/threeten/bp/chrono/ChronoZonedDateTime;->toEpochSecond()J HPLorg/threeten/bp/chrono/ChronoZonedDateTime;->toInstant()Lorg/threeten/bp/Instant; HPLorg/threeten/bp/chrono/IsoChronology;->isLeapYear(J)Z HPLorg/threeten/bp/format/DateTimeBuilder;->resolve(Lorg/threeten/bp/format/ResolverStyle;Ljava/util/Set;)Lorg/threeten/bp/format/DateTimeBuilder; HPLorg/threeten/bp/format/DateTimeFormatter;->(Lorg/threeten/bp/format/DateTimeFormatterBuilder$CompositePrinterParser;Ljava/util/Locale;Lorg/threeten/bp/format/DecimalStyle;Lorg/threeten/bp/format/ResolverStyle;Ljava/util/Set;Lorg/threeten/bp/chrono/Chronology;Lorg/threeten/bp/ZoneId;)V HPLorg/threeten/bp/format/DateTimeFormatter;->format(Lorg/threeten/bp/temporal/TemporalAccessor;)Ljava/lang/String; HPLorg/threeten/bp/format/DateTimeFormatter;->ofPattern(Ljava/lang/String;)Lorg/threeten/bp/format/DateTimeFormatter; HPLorg/threeten/bp/format/DateTimeFormatterBuilder$CharLiteralPrinterParser;->(C)V HPLorg/threeten/bp/format/DateTimeFormatterBuilder$CharLiteralPrinterParser;->print(Lcom/google/firebase/iid/zzab;Ljava/lang/StringBuilder;)Z HPLorg/threeten/bp/format/DateTimeFormatterBuilder$CompositePrinterParser;->(Ljava/util/List;Z)V HPLorg/threeten/bp/format/DateTimeFormatterBuilder$CompositePrinterParser;->print(Lcom/google/firebase/iid/zzab;Ljava/lang/StringBuilder;)Z HPLorg/threeten/bp/format/DateTimeFormatterBuilder$FractionPrinterParser;->print(Lcom/google/firebase/iid/zzab;Ljava/lang/StringBuilder;)Z HPLorg/threeten/bp/format/DateTimeFormatterBuilder$NumberPrinterParser;->(Lorg/threeten/bp/temporal/TemporalField;III)V HPLorg/threeten/bp/format/DateTimeFormatterBuilder$NumberPrinterParser;->print(Lcom/google/firebase/iid/zzab;Ljava/lang/StringBuilder;)Z HPLorg/threeten/bp/format/DateTimeFormatterBuilder$OffsetIdPrinterParser;->print(Lcom/google/firebase/iid/zzab;Ljava/lang/StringBuilder;)Z HPLorg/threeten/bp/format/DateTimeFormatterBuilder$TextPrinterParser;->(Lorg/threeten/bp/temporal/TemporalField;Lorg/threeten/bp/format/TextStyle;Lorg/threeten/bp/format/DateTimeTextProvider;)V HPLorg/threeten/bp/format/DateTimeFormatterBuilder$TextPrinterParser;->print(Lcom/google/firebase/iid/zzab;Ljava/lang/StringBuilder;)Z HPLorg/threeten/bp/format/DateTimeFormatterBuilder;->()V HPLorg/threeten/bp/format/DateTimeFormatterBuilder;->appendInternal(Lorg/threeten/bp/format/DateTimeFormatterBuilder$DateTimePrinterParser;)I HPLorg/threeten/bp/format/DateTimeFormatterBuilder;->appendLiteral(C)Lorg/threeten/bp/format/DateTimeFormatterBuilder; HPLorg/threeten/bp/format/DateTimeFormatterBuilder;->appendText(Lorg/threeten/bp/temporal/TemporalField;Lorg/threeten/bp/format/TextStyle;)Lorg/threeten/bp/format/DateTimeFormatterBuilder; HPLorg/threeten/bp/format/DateTimeFormatterBuilder;->appendValue(Lorg/threeten/bp/format/DateTimeFormatterBuilder$NumberPrinterParser;)Lorg/threeten/bp/format/DateTimeFormatterBuilder; HPLorg/threeten/bp/format/DateTimeFormatterBuilder;->appendValue(Lorg/threeten/bp/temporal/TemporalField;)Lorg/threeten/bp/format/DateTimeFormatterBuilder; HPLorg/threeten/bp/format/DateTimeFormatterBuilder;->appendValue(Lorg/threeten/bp/temporal/TemporalField;I)Lorg/threeten/bp/format/DateTimeFormatterBuilder; HPLorg/threeten/bp/format/DateTimeFormatterBuilder;->toFormatter()Lorg/threeten/bp/format/DateTimeFormatter; HPLorg/threeten/bp/format/SimpleDateTimeTextProvider$LocaleStore;->getText(JLorg/threeten/bp/format/TextStyle;)Ljava/lang/String; HPLorg/threeten/bp/format/SimpleDateTimeTextProvider;->findStore(Lorg/threeten/bp/temporal/TemporalField;Ljava/util/Locale;)Ljava/lang/Object; HPLorg/threeten/bp/format/SimpleDateTimeTextProvider;->getText(Lorg/threeten/bp/temporal/TemporalField;JLorg/threeten/bp/format/TextStyle;Ljava/util/Locale;)Ljava/lang/String; HPLorg/threeten/bp/jdk8/DefaultInterfaceTemporal;->()V HPLorg/threeten/bp/temporal/ChronoField;->checkValidIntValue(J)I HPLorg/threeten/bp/temporal/ChronoField;->isTimeBased()Z HPLorg/threeten/bp/temporal/ValueRange;->checkValidValue(JLorg/threeten/bp/temporal/TemporalField;)J HPLorg/threeten/bp/temporal/ValueRange;->isValidValue(J)Z HPLorg/threeten/bp/zone/StandardZoneRules;->findTransitionArray(I)[Lorg/threeten/bp/zone/ZoneOffsetTransition; HPLorg/threeten/bp/zone/StandardZoneRules;->getOffset(Lorg/threeten/bp/Instant;)Lorg/threeten/bp/ZoneOffset; HPLorg/threeten/bp/zone/StandardZoneRules;->getOffsetInfo(Lorg/threeten/bp/LocalDateTime;)Ljava/lang/Object; HPLorg/threeten/bp/zone/ZoneOffsetTransition;->getDateTimeAfter()Lorg/threeten/bp/LocalDateTime; HPLorg/threeten/bp/zone/ZoneOffsetTransition;->isGap()Z HPLorg/threeten/bp/zone/ZoneRules$Fixed;->(Lorg/threeten/bp/ZoneOffset;)V HPLorg/threeten/bp/zone/ZoneRules$Fixed;->getOffset(Lorg/threeten/bp/Instant;)Lorg/threeten/bp/ZoneOffset; HPLorg/threeten/bp/zone/ZoneRules;->()V PLandroidx/activity/ComponentActivity$$ExternalSyntheticLambda0;->(Landroidx/activity/ComponentActivity;I)V PLandroidx/activity/ComponentActivity$$ExternalSyntheticLambda0;->onContextAvailable(Landroid/content/Context;)V PLandroidx/activity/ComponentActivity$$ExternalSyntheticLambda1;->(Ljava/lang/Object;I)V PLandroidx/activity/ComponentActivity$$ExternalSyntheticLambda1;->saveState()Landroid/os/Bundle; PLandroidx/activity/ComponentActivity$2;->(Landroidx/activity/ComponentActivity;)V PLandroidx/activity/ComponentActivity$3;->(Landroidx/activity/ComponentActivity;)V PLandroidx/activity/ComponentActivity$3;->onStateChanged(Landroidx/lifecycle/LifecycleOwner;Landroidx/lifecycle/Lifecycle$Event;)V PLandroidx/activity/ComponentActivity$4;->(Landroidx/activity/ComponentActivity;)V PLandroidx/activity/ComponentActivity$4;->onStateChanged(Landroidx/lifecycle/LifecycleOwner;Landroidx/lifecycle/Lifecycle$Event;)V PLandroidx/activity/ComponentActivity$5;->(Landroidx/activity/ComponentActivity;)V PLandroidx/activity/ComponentActivity$5;->onStateChanged(Landroidx/lifecycle/LifecycleOwner;Landroidx/lifecycle/Lifecycle$Event;)V PLandroidx/activity/ComponentActivity;->$r8$lambda$Mg7-hF6_XzI8jXHyb9wZTvbC5nA(Landroidx/activity/ComponentActivity;Landroid/content/Context;)V PLandroidx/activity/ComponentActivity;->$r8$lambda$uMG6y9sMaPUFZmnRrSgWpORKiAI(Landroidx/activity/ComponentActivity;)Landroid/os/Bundle; PLandroidx/activity/ComponentActivity;->()V PLandroidx/activity/ComponentActivity;->addOnContextAvailableListener(Landroidx/activity/contextaware/OnContextAvailableListener;)V PLandroidx/activity/ComponentActivity;->ensureViewModelStore()V PLandroidx/activity/ComponentActivity;->getActivityResultRegistry()Landroidx/activity/result/ActivityResultRegistry; PLandroidx/activity/ComponentActivity;->getDefaultViewModelProviderFactory()Landroidx/lifecycle/ViewModelProvider$Factory; PLandroidx/activity/ComponentActivity;->getLifecycle()Landroidx/lifecycle/Lifecycle; PLandroidx/activity/ComponentActivity;->getOnBackPressedDispatcher()Landroidx/activity/OnBackPressedDispatcher; PLandroidx/activity/ComponentActivity;->getSavedStateRegistry()Landroidx/savedstate/SavedStateRegistry; PLandroidx/activity/ComponentActivity;->getViewModelStore()Landroidx/lifecycle/ViewModelStore; PLandroidx/activity/ComponentActivity;->onCreate(Landroid/os/Bundle;)V PLandroidx/activity/ComponentActivity;->onSaveInstanceState(Landroid/os/Bundle;)V PLandroidx/activity/OnBackPressedCallback;->(Z)V PLandroidx/activity/OnBackPressedCallback;->remove()V PLandroidx/activity/OnBackPressedDispatcher$LifecycleOnBackPressedCancellable;->(Landroidx/activity/OnBackPressedDispatcher;Landroidx/lifecycle/Lifecycle;Landroidx/activity/OnBackPressedCallback;)V PLandroidx/activity/OnBackPressedDispatcher$LifecycleOnBackPressedCancellable;->cancel()V PLandroidx/activity/OnBackPressedDispatcher$LifecycleOnBackPressedCancellable;->onStateChanged(Landroidx/lifecycle/LifecycleOwner;Landroidx/lifecycle/Lifecycle$Event;)V PLandroidx/activity/OnBackPressedDispatcher$OnBackPressedCancellable;->(Landroidx/activity/OnBackPressedDispatcher;Landroidx/activity/OnBackPressedCallback;)V PLandroidx/activity/OnBackPressedDispatcher$OnBackPressedCancellable;->cancel()V PLandroidx/activity/OnBackPressedDispatcher;->(Ljava/lang/Runnable;)V PLandroidx/activity/OnBackPressedDispatcher;->addCallback(Landroidx/lifecycle/LifecycleOwner;Landroidx/activity/OnBackPressedCallback;)V PLandroidx/activity/contextaware/ContextAwareHelper;->()V PLandroidx/activity/result/ActivityResultLauncher;->()V PLandroidx/activity/result/ActivityResultRegistry$2;->(Landroidx/activity/result/ActivityResultRegistry;Ljava/lang/String;ILandroidx/activity/result/contract/ActivityResultContract;I)V PLandroidx/activity/result/ActivityResultRegistry$2;->unregister()V PLandroidx/activity/result/ActivityResultRegistry$CallbackAndContract;->(Landroidx/activity/result/ActivityResultCallback;Landroidx/activity/result/contract/ActivityResultContract;)V PLandroidx/activity/result/ActivityResultRegistry;->()V PLandroidx/activity/result/ActivityResultRegistry;->register(Ljava/lang/String;Landroidx/activity/result/contract/ActivityResultContract;Landroidx/activity/result/ActivityResultCallback;)Landroidx/activity/result/ActivityResultLauncher; PLandroidx/activity/result/ActivityResultRegistry;->unregister(Ljava/lang/String;)V PLandroidx/activity/result/contract/ActivityResultContract;->()V PLandroidx/appcompat/R$bool;->()V PLandroidx/appcompat/R$bool;->getDrawable(Landroid/content/Context;Landroid/content/Context;ILandroid/content/res/Resources$Theme;)Landroid/graphics/drawable/Drawable; PLandroidx/appcompat/R$bool;->zzb(II)I PLandroidx/appcompat/R$id$$IA$1;->_applyState(ILandroid/view/View;)V PLandroidx/appcompat/R$id$$IA$1;->_from(I)I PLandroidx/appcompat/R$id$$IA$1;->m(FFFF)F PLandroidx/appcompat/R$id$$IA$1;->m(Landroid/view/View;Ljava/lang/String;Landroidx/core/view/WindowInsetsCompat;Ljava/lang/String;Lcom/google/samples/apps/iosched/util/ViewPaddingState;Ljava/lang/String;ILjava/lang/String;)Landroidx/core/graphics/Insets; PLandroidx/appcompat/R$id$$IA$1;->m(Landroidx/fragment/app/Fragment;Ljava/lang/String;)Landroidx/lifecycle/ViewModelStore; PLandroidx/appcompat/R$id$$IA$1;->m(Ljava/lang/String;)Ljava/lang/StringBuilder; PLandroidx/appcompat/R$id$$IA$1;->m(Ljava/lang/String;I)I PLandroidx/appcompat/R$id$$IA$1;->m(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; PLandroidx/appcompat/R$id$$IA$1;->m(Ljava/lang/StringBuilder;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; PLandroidx/appcompat/app/ActionBar$LayoutParams;->(II)V PLandroidx/appcompat/app/ActionBar$LayoutParams;->(Landroid/content/Context;Landroid/util/AttributeSet;)V PLandroidx/appcompat/app/AlertDialog$Builder;->(Ljava/lang/Object;I)V PLandroidx/appcompat/app/AppCompatActivity$1;->(Landroidx/appcompat/app/AppCompatActivity;)V PLandroidx/appcompat/app/AppCompatActivity$1;->(Landroidx/savedstate/SavedStateRegistry;)V PLandroidx/appcompat/app/AppCompatActivity$1;->saveState()Landroid/os/Bundle; PLandroidx/appcompat/app/AppCompatActivity$2;->(Landroidx/appcompat/app/AppCompatActivity;I)V PLandroidx/appcompat/app/AppCompatActivity$2;->onContextAvailable(Landroid/content/Context;)V PLandroidx/appcompat/app/AppCompatActivity;->()V PLandroidx/appcompat/app/AppCompatActivity;->attachBaseContext(Landroid/content/Context;)V PLandroidx/appcompat/app/AppCompatActivity;->getDelegate()Landroidx/appcompat/app/AppCompatDelegate; PLandroidx/appcompat/app/AppCompatActivity;->initViewTreeOwners()V PLandroidx/appcompat/app/AppCompatActivity;->onContentChanged()V PLandroidx/appcompat/app/AppCompatActivity;->onDestroy()V PLandroidx/appcompat/app/AppCompatActivity;->onPostCreate(Landroid/os/Bundle;)V PLandroidx/appcompat/app/AppCompatActivity;->onPostResume()V PLandroidx/appcompat/app/AppCompatActivity;->onStart()V PLandroidx/appcompat/app/AppCompatActivity;->onStop()V PLandroidx/appcompat/app/AppCompatActivity;->onSupportContentChanged()V PLandroidx/appcompat/app/AppCompatActivity;->onTitleChanged(Ljava/lang/CharSequence;I)V PLandroidx/appcompat/app/AppCompatActivity;->setContentView(Landroid/view/View;)V PLandroidx/appcompat/app/AppCompatActivity;->setTheme(I)V PLandroidx/appcompat/app/AppCompatDelegate;->()V PLandroidx/appcompat/app/AppCompatDelegate;->()V PLandroidx/appcompat/app/AppCompatDelegate;->removeDelegateFromActives(Landroidx/appcompat/app/AppCompatDelegate;)V PLandroidx/appcompat/app/AppCompatDelegateImpl$2;->(Landroidx/appcompat/app/AppCompatDelegateImpl;I)V PLandroidx/appcompat/app/AppCompatDelegateImpl$2;->run()V PLandroidx/appcompat/app/AppCompatDelegateImpl$3;->(Landroidx/appcompat/app/AppCompatDelegateImpl;)V PLandroidx/appcompat/app/AppCompatDelegateImpl$3;->onApplyWindowInsets(Landroid/view/View;Landroidx/core/view/WindowInsetsCompat;)Landroidx/core/view/WindowInsetsCompat; PLandroidx/appcompat/app/AppCompatDelegateImpl$5;->(Landroidx/appcompat/app/AppCompatDelegateImpl;)V PLandroidx/appcompat/app/AppCompatDelegateImpl$AppCompatWindowCallback;->(Landroidx/appcompat/app/AppCompatDelegateImpl;Landroid/view/Window$Callback;)V PLandroidx/appcompat/app/AppCompatDelegateImpl$AppCompatWindowCallback;->onContentChanged()V PLandroidx/appcompat/app/AppCompatDelegateImpl$PanelFeatureState;->(I)V PLandroidx/appcompat/app/AppCompatDelegateImpl;->()V PLandroidx/appcompat/app/AppCompatDelegateImpl;->(Landroid/content/Context;Landroid/view/Window;Landroidx/appcompat/app/AppCompatCallback;Ljava/lang/Object;)V PLandroidx/appcompat/app/AppCompatDelegateImpl;->applyDayNight()Z PLandroidx/appcompat/app/AppCompatDelegateImpl;->applyDayNight(Z)Z PLandroidx/appcompat/app/AppCompatDelegateImpl;->attachToWindow(Landroid/view/Window;)V PLandroidx/appcompat/app/AppCompatDelegateImpl;->createOverrideConfigurationForDayNight(Landroid/content/Context;ILandroid/content/res/Configuration;)Landroid/content/res/Configuration; PLandroidx/appcompat/app/AppCompatDelegateImpl;->doInvalidatePanelMenu(I)V PLandroidx/appcompat/app/AppCompatDelegateImpl;->endOnGoingFadeAnimation()V PLandroidx/appcompat/app/AppCompatDelegateImpl;->ensureSubDecor()V PLandroidx/appcompat/app/AppCompatDelegateImpl;->ensureWindow()V PLandroidx/appcompat/app/AppCompatDelegateImpl;->getPanelState(I)Landroidx/appcompat/app/AppCompatDelegateImpl$PanelFeatureState; PLandroidx/appcompat/app/AppCompatDelegateImpl;->initWindowDecorActionBar()V PLandroidx/appcompat/app/AppCompatDelegateImpl;->installViewFactory()V PLandroidx/appcompat/app/AppCompatDelegateImpl;->invalidatePanelMenu(I)V PLandroidx/appcompat/app/AppCompatDelegateImpl;->mapNightMode(Landroid/content/Context;I)I PLandroidx/appcompat/app/AppCompatDelegateImpl;->onCreate(Landroid/os/Bundle;)V PLandroidx/appcompat/app/AppCompatDelegateImpl;->onDestroy()V PLandroidx/appcompat/app/AppCompatDelegateImpl;->requestWindowFeature(I)Z PLandroidx/appcompat/app/AppCompatDelegateImpl;->setContentView(Landroid/view/View;)V PLandroidx/appcompat/app/AppCompatDelegateImpl;->setLocalNightMode(I)V PLandroidx/appcompat/app/AppCompatDelegateImpl;->setTitle(Ljava/lang/CharSequence;)V PLandroidx/appcompat/app/AppCompatDelegateImpl;->throwFeatureRequestIfSubDecorInstalled()V PLandroidx/appcompat/app/AppCompatDelegateImpl;->updateStatusGuard(Landroidx/core/view/WindowInsetsCompat;Landroid/graphics/Rect;)I PLandroidx/appcompat/app/AppCompatViewInflater;->()V PLandroidx/appcompat/app/AppCompatViewInflater;->()V PLandroidx/appcompat/app/AppCompatViewInflater;->verifyNotNull(Landroid/view/View;Ljava/lang/String;)V PLandroidx/appcompat/content/res/AppCompatResources;->()V PLandroidx/appcompat/content/res/AppCompatResources;->getDrawable(Landroid/content/Context;I)Landroid/graphics/drawable/Drawable; PLandroidx/appcompat/view/ActionBarPolicy;->(Landroid/content/Context;)V PLandroidx/appcompat/view/ActionBarPolicy;->(Landroid/content/Context;I)V PLandroidx/appcompat/view/ActionBarPolicy;->build(Lcom/bumptech/glide/load/model/MultiModelLoaderFactory;)Lcom/bumptech/glide/load/model/ModelLoader; PLandroidx/appcompat/view/ActionBarPolicy;->getSettingsFile()Ljava/io/File; PLandroidx/appcompat/view/ActionBarPolicy;->readCachedSettings()Lorg/json/JSONObject; PLandroidx/appcompat/view/ActionBarPolicy;->zzb(Landroid/content/Intent;)Z PLandroidx/appcompat/view/ActionBarPolicy;->zzc()Lcom/google/android/gms/measurement/internal/zzes; PLandroidx/appcompat/view/ContextThemeWrapper;->(Landroid/content/Context;I)V PLandroidx/appcompat/view/ContextThemeWrapper;->applyOverrideConfiguration(Landroid/content/res/Configuration;)V PLandroidx/appcompat/view/ContextThemeWrapper;->getResources()Landroid/content/res/Resources; PLandroidx/appcompat/view/ContextThemeWrapper;->getTheme()Landroid/content/res/Resources$Theme; PLandroidx/appcompat/view/ContextThemeWrapper;->initializeTheme()V PLandroidx/appcompat/view/SupportMenuInflater$MenuState;->(Landroidx/appcompat/view/SupportMenuInflater;Landroid/view/Menu;)V PLandroidx/appcompat/view/SupportMenuInflater;->()V PLandroidx/appcompat/view/SupportMenuInflater;->(Landroid/content/Context;)V PLandroidx/appcompat/view/SupportMenuInflater;->inflate(ILandroid/view/Menu;)V PLandroidx/appcompat/view/WindowCallbackWrapper;->(Landroid/view/Window$Callback;)V PLandroidx/appcompat/view/WindowCallbackWrapper;->dispatchPopulateAccessibilityEvent(Landroid/view/accessibility/AccessibilityEvent;)Z PLandroidx/appcompat/view/WindowCallbackWrapper;->dispatchTouchEvent(Landroid/view/MotionEvent;)Z PLandroidx/appcompat/view/WindowCallbackWrapper;->onAttachedToWindow()V PLandroidx/appcompat/view/WindowCallbackWrapper;->onDetachedFromWindow()V PLandroidx/appcompat/view/WindowCallbackWrapper;->onWindowAttributesChanged(Landroid/view/WindowManager$LayoutParams;)V PLandroidx/appcompat/view/WindowCallbackWrapper;->onWindowFocusChanged(Z)V PLandroidx/appcompat/view/menu/ActionMenuItemView$PopupCallback;->()V PLandroidx/appcompat/view/menu/ActionMenuItemView;->(Landroid/content/Context;Landroid/util/AttributeSet;)V PLandroidx/appcompat/view/menu/ActionMenuItemView;->getItemData()Landroidx/appcompat/view/menu/MenuItemImpl; PLandroidx/appcompat/view/menu/ActionMenuItemView;->hasText()Z PLandroidx/appcompat/view/menu/ActionMenuItemView;->setIcon(Landroid/graphics/drawable/Drawable;)V PLandroidx/appcompat/view/menu/ActionMenuItemView;->setItemInvoker(Landroidx/appcompat/view/menu/MenuBuilder$ItemInvoker;)V PLandroidx/appcompat/view/menu/ActionMenuItemView;->setPopupCallback(Landroidx/appcompat/view/menu/ActionMenuItemView$PopupCallback;)V PLandroidx/appcompat/view/menu/ActionMenuItemView;->setTitle(Ljava/lang/CharSequence;)V PLandroidx/appcompat/view/menu/ActionMenuItemView;->shouldAllowTextWithIcon()Z PLandroidx/appcompat/view/menu/MenuBuilder;->()V PLandroidx/appcompat/view/menu/MenuBuilder;->(Landroid/content/Context;)V PLandroidx/appcompat/view/menu/MenuBuilder;->add(IIILjava/lang/CharSequence;)Landroid/view/MenuItem; PLandroidx/appcompat/view/menu/MenuBuilder;->addInternal(IIILjava/lang/CharSequence;)Landroid/view/MenuItem; PLandroidx/appcompat/view/menu/MenuBuilder;->addMenuPresenter(Landroidx/appcompat/view/menu/MenuPresenter;Landroid/content/Context;)V PLandroidx/appcompat/view/menu/MenuBuilder;->findItem(I)Landroid/view/MenuItem; PLandroidx/appcompat/view/menu/MenuBuilder;->flagActionItems()V PLandroidx/appcompat/view/menu/MenuBuilder;->getItem(I)Landroid/view/MenuItem; PLandroidx/appcompat/view/menu/MenuBuilder;->startDispatchingItemsChanged()V PLandroidx/appcompat/view/menu/MenuItemImpl;->(Landroidx/appcompat/view/menu/MenuBuilder;IIIILjava/lang/CharSequence;I)V PLandroidx/appcompat/view/menu/MenuItemImpl;->applyIconTintIfNecessary(Landroid/graphics/drawable/Drawable;)Landroid/graphics/drawable/Drawable; PLandroidx/appcompat/view/menu/MenuItemImpl;->getActionView()Landroid/view/View; PLandroidx/appcompat/view/menu/MenuItemImpl;->getGroupId()I PLandroidx/appcompat/view/menu/MenuItemImpl;->getIcon()Landroid/graphics/drawable/Drawable; PLandroidx/appcompat/view/menu/MenuItemImpl;->getItemId()I PLandroidx/appcompat/view/menu/MenuItemImpl;->getTitleCondensed()Ljava/lang/CharSequence; PLandroidx/appcompat/view/menu/MenuItemImpl;->hasSubMenu()Z PLandroidx/appcompat/view/menu/MenuItemImpl;->isActionButton()Z PLandroidx/appcompat/view/menu/MenuItemImpl;->isCheckable()Z PLandroidx/appcompat/view/menu/MenuItemImpl;->isChecked()Z PLandroidx/appcompat/view/menu/MenuItemImpl;->isEnabled()Z PLandroidx/appcompat/view/menu/MenuItemImpl;->isExclusiveCheckable()Z PLandroidx/appcompat/view/menu/MenuItemImpl;->setAlphabeticShortcut(CI)Landroid/view/MenuItem; PLandroidx/appcompat/view/menu/MenuItemImpl;->setCheckable(Z)Landroid/view/MenuItem; PLandroidx/appcompat/view/menu/MenuItemImpl;->setChecked(Z)Landroid/view/MenuItem; PLandroidx/appcompat/view/menu/MenuItemImpl;->setCheckedInt(Z)V PLandroidx/appcompat/view/menu/MenuItemImpl;->setContentDescription(Ljava/lang/CharSequence;)Landroidx/core/internal/view/SupportMenuItem; PLandroidx/appcompat/view/menu/MenuItemImpl;->setEnabled(Z)Landroid/view/MenuItem; PLandroidx/appcompat/view/menu/MenuItemImpl;->setExclusiveCheckable(Z)V PLandroidx/appcompat/view/menu/MenuItemImpl;->setIcon(I)Landroid/view/MenuItem; PLandroidx/appcompat/view/menu/MenuItemImpl;->setIcon(Landroid/graphics/drawable/Drawable;)Landroid/view/MenuItem; PLandroidx/appcompat/view/menu/MenuItemImpl;->setIsActionButton(Z)V PLandroidx/appcompat/view/menu/MenuItemImpl;->setNumericShortcut(CI)Landroid/view/MenuItem; PLandroidx/appcompat/view/menu/MenuItemImpl;->setOnMenuItemClickListener(Landroid/view/MenuItem$OnMenuItemClickListener;)Landroid/view/MenuItem; PLandroidx/appcompat/view/menu/MenuItemImpl;->setShowAsAction(I)V PLandroidx/appcompat/view/menu/MenuItemImpl;->setTitleCondensed(Ljava/lang/CharSequence;)Landroid/view/MenuItem; PLandroidx/appcompat/view/menu/MenuItemImpl;->setTooltipText(Ljava/lang/CharSequence;)Landroidx/core/internal/view/SupportMenuItem; PLandroidx/appcompat/view/menu/MenuItemImpl;->setVisible(Z)Landroid/view/MenuItem; PLandroidx/appcompat/view/menu/MenuItemImpl;->setVisibleInt(Z)Z PLandroidx/appcompat/widget/ActionMenuPresenter$ActionMenuPopupCallback;->(Landroidx/appcompat/widget/ActionMenuPresenter;)V PLandroidx/appcompat/widget/ActionMenuPresenter$OverflowMenuButton;->(Landroidx/appcompat/widget/ActionMenuPresenter;Landroid/content/Context;)V PLandroidx/appcompat/widget/ActionMenuPresenter;->(Landroid/content/Context;)V PLandroidx/appcompat/widget/ActionMenuPresenter;->dismissPopupMenus()Z PLandroidx/appcompat/widget/ActionMenuPresenter;->flagActionItems()Z PLandroidx/appcompat/widget/ActionMenuPresenter;->hideOverflowMenu()Z PLandroidx/appcompat/widget/ActionMenuPresenter;->hideSubMenus()Z PLandroidx/appcompat/widget/ActionMenuPresenter;->initForMenu(Landroid/content/Context;Landroidx/appcompat/view/menu/MenuBuilder;)V PLandroidx/appcompat/widget/ActionMenuPresenter;->isOverflowMenuShowing()Z PLandroidx/appcompat/widget/ActionMenuView$LayoutParams;->(II)V PLandroidx/appcompat/widget/ActionMenuView$LayoutParams;->(Landroid/content/Context;Landroid/util/AttributeSet;)V PLandroidx/appcompat/widget/ActionMenuView;->(Landroid/content/Context;Landroid/util/AttributeSet;)V PLandroidx/appcompat/widget/ActionMenuView;->checkLayoutParams(Landroid/view/ViewGroup$LayoutParams;)Z PLandroidx/appcompat/widget/ActionMenuView;->generateDefaultLayoutParams()Landroidx/appcompat/widget/ActionMenuView$LayoutParams; PLandroidx/appcompat/widget/ActionMenuView;->generateLayoutParams(Landroid/util/AttributeSet;)Landroid/view/ViewGroup$LayoutParams; PLandroidx/appcompat/widget/ActionMenuView;->getMenu()Landroid/view/Menu; PLandroidx/appcompat/widget/ActionMenuView;->onDetachedFromWindow()V PLandroidx/appcompat/widget/ActionMenuView;->onLayout(ZIIII)V PLandroidx/appcompat/widget/ActionMenuView;->setExpandedActionViewsExclusive(Z)V PLandroidx/appcompat/widget/ActionMenuView;->setOnMenuItemClickListener(Landroidx/appcompat/widget/ActionMenuView$OnMenuItemClickListener;)V PLandroidx/appcompat/widget/ActionMenuView;->setOverflowReserved(Z)V PLandroidx/appcompat/widget/ActionMenuView;->setPopupTheme(I)V PLandroidx/appcompat/widget/AppCompatBackgroundHelper;->onSetBackgroundDrawable()V PLandroidx/appcompat/widget/AppCompatBackgroundHelper;->setInternalBackgroundTint(Landroid/content/res/ColorStateList;)V PLandroidx/appcompat/widget/AppCompatBackgroundHelper;->setSupportBackgroundTintList(Landroid/content/res/ColorStateList;)V PLandroidx/appcompat/widget/AppCompatButton;->(Landroid/content/Context;Landroid/util/AttributeSet;I)V PLandroidx/appcompat/widget/AppCompatButton;->drawableStateChanged()V PLandroidx/appcompat/widget/AppCompatButton;->onTextChanged(Ljava/lang/CharSequence;III)V PLandroidx/appcompat/widget/AppCompatButton;->setBackgroundDrawable(Landroid/graphics/drawable/Drawable;)V PLandroidx/appcompat/widget/AppCompatButton;->setSupportBackgroundTintList(Landroid/content/res/ColorStateList;)V PLandroidx/appcompat/widget/AppCompatCheckedTextView;->()V PLandroidx/appcompat/widget/AppCompatCheckedTextView;->(Landroid/content/Context;Landroid/util/AttributeSet;)V PLandroidx/appcompat/widget/AppCompatCheckedTextView;->drawableStateChanged()V PLandroidx/appcompat/widget/AppCompatDrawableManager;->()V PLandroidx/appcompat/widget/AppCompatDrawableManager;->()V PLandroidx/appcompat/widget/AppCompatDrawableManager;->getTintList(Landroid/content/Context;I)Landroid/content/res/ColorStateList; PLandroidx/appcompat/widget/AppCompatDrawableManager;->preload()V PLandroidx/appcompat/widget/AppCompatImageButton;->setBackgroundDrawable(Landroid/graphics/drawable/Drawable;)V PLandroidx/appcompat/widget/AppCompatImageButton;->setImageDrawable(Landroid/graphics/drawable/Drawable;)V PLandroidx/appcompat/widget/AppCompatImageView;->(Landroid/content/Context;Landroid/util/AttributeSet;)V PLandroidx/appcompat/widget/AppCompatImageView;->setBackgroundDrawable(Landroid/graphics/drawable/Drawable;)V PLandroidx/appcompat/widget/AppCompatImageView;->setImageDrawable(Landroid/graphics/drawable/Drawable;)V PLandroidx/appcompat/widget/AppCompatSpinner$1;->(Landroid/view/View;Landroid/view/View;Ljava/lang/Object;I)V PLandroidx/appcompat/widget/AppCompatTextHelper$1;->onFontRetrievalFailed(I)V PLandroidx/appcompat/widget/AppCompatTextHelper;->createTintInfo(Landroid/content/Context;Landroidx/appcompat/widget/AppCompatDrawableManager;I)Lokhttp3/ConnectionSpec$Builder; PLandroidx/appcompat/widget/AppCompatTextView;->setBackgroundDrawable(Landroid/graphics/drawable/Drawable;)V PLandroidx/appcompat/widget/AppCompatTextView;->setCompoundDrawablesRelative(Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;)V PLandroidx/appcompat/widget/AppCompatTextView;->setCompoundDrawablesRelativeWithIntrinsicBounds(Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;)V PLandroidx/appcompat/widget/AppCompatTextView;->setTextAppearance(Landroid/content/Context;I)V PLandroidx/appcompat/widget/AppCompatTextViewAutoSizeHelper$Impl23;->()V PLandroidx/appcompat/widget/AppCompatTextViewAutoSizeHelper$Impl29;->()V PLandroidx/appcompat/widget/AppCompatTextViewAutoSizeHelper$Impl;->()V PLandroidx/appcompat/widget/AppCompatTextViewAutoSizeHelper;->()V PLandroidx/appcompat/widget/ContentFrameLayout;->(Landroid/content/Context;Landroid/util/AttributeSet;)V PLandroidx/appcompat/widget/ContentFrameLayout;->getMinWidthMajor()Landroid/util/TypedValue; PLandroidx/appcompat/widget/ContentFrameLayout;->getMinWidthMinor()Landroid/util/TypedValue; PLandroidx/appcompat/widget/ContentFrameLayout;->onAttachedToWindow()V PLandroidx/appcompat/widget/ContentFrameLayout;->onDetachedFromWindow()V PLandroidx/appcompat/widget/ContentFrameLayout;->setAttachListener(Landroidx/appcompat/widget/ContentFrameLayout$OnAttachListener;)V PLandroidx/appcompat/widget/DrawableUtils;->()V PLandroidx/appcompat/widget/DrawableUtils;->canSafelyMutateDrawable(Landroid/graphics/drawable/Drawable;)Z PLandroidx/appcompat/widget/FitWindowsLinearLayout;->(Landroid/content/Context;Landroid/util/AttributeSet;)V PLandroidx/appcompat/widget/FitWindowsLinearLayout;->fitSystemWindows(Landroid/graphics/Rect;)Z PLandroidx/appcompat/widget/ForwardingListener;->(Landroid/view/View;)V PLandroidx/appcompat/widget/LinearLayoutCompat$LayoutParams;->(II)V PLandroidx/appcompat/widget/LinearLayoutCompat$LayoutParams;->(Landroid/content/Context;Landroid/util/AttributeSet;)V PLandroidx/appcompat/widget/LinearLayoutCompat;->(Landroid/content/Context;Landroid/util/AttributeSet;I)V PLandroidx/appcompat/widget/LinearLayoutCompat;->getVirtualChildCount()I PLandroidx/appcompat/widget/LinearLayoutCompat;->onInitializeAccessibilityNodeInfo(Landroid/view/accessibility/AccessibilityNodeInfo;)V PLandroidx/appcompat/widget/LinearLayoutCompat;->setBaselineAligned(Z)V PLandroidx/appcompat/widget/LinearLayoutCompat;->setDividerDrawable(Landroid/graphics/drawable/Drawable;)V PLandroidx/appcompat/widget/ResourceManagerInternal$ColorFilterLruCache;->(I)V PLandroidx/appcompat/widget/ResourceManagerInternal;->()V PLandroidx/appcompat/widget/ResourceManagerInternal;->()V PLandroidx/appcompat/widget/ResourceManagerInternal;->get()Landroidx/appcompat/widget/ResourceManagerInternal; PLandroidx/appcompat/widget/ResourceManagerInternal;->getCachedDrawable(Landroid/content/Context;J)Landroid/graphics/drawable/Drawable; PLandroidx/appcompat/widget/ResourceManagerInternal;->getDrawable(Landroid/content/Context;I)Landroid/graphics/drawable/Drawable; PLandroidx/appcompat/widget/ResourceManagerInternal;->getPorterDuffColorFilter(ILandroid/graphics/PorterDuff$Mode;)Landroid/graphics/PorterDuffColorFilter; PLandroidx/appcompat/widget/ResourceManagerInternal;->loadDrawableFromDelegates(Landroid/content/Context;I)Landroid/graphics/drawable/Drawable; PLandroidx/appcompat/widget/ResourceManagerInternal;->tintDrawable(Landroid/content/Context;IZLandroid/graphics/drawable/Drawable;)Landroid/graphics/drawable/Drawable; PLandroidx/appcompat/widget/RtlSpacingHelper;->()V PLandroidx/appcompat/widget/RtlSpacingHelper;->setRelative(II)V PLandroidx/appcompat/widget/SearchView$4;->(Ljava/lang/Object;I)V PLandroidx/appcompat/widget/SearchView$4;->onLayoutChange(Landroid/view/View;IIIIIIII)V PLandroidx/appcompat/widget/ThemeUtils;->()V PLandroidx/appcompat/widget/TintContextWrapper;->()V PLandroidx/appcompat/widget/Toolbar$3;->(Ljava/lang/Object;I)V PLandroidx/appcompat/widget/Toolbar$ExpandedActionViewMenuPresenter;->(Landroidx/appcompat/widget/Toolbar;)V PLandroidx/appcompat/widget/Toolbar$ExpandedActionViewMenuPresenter;->flagActionItems()Z PLandroidx/appcompat/widget/Toolbar$ExpandedActionViewMenuPresenter;->initForMenu(Landroid/content/Context;Landroidx/appcompat/view/menu/MenuBuilder;)V PLandroidx/appcompat/widget/Toolbar$ExpandedActionViewMenuPresenter;->updateMenuView(Z)V PLandroidx/appcompat/widget/Toolbar$LayoutParams;->(II)V PLandroidx/appcompat/widget/Toolbar$LayoutParams;->(Landroid/content/Context;Landroid/util/AttributeSet;)V PLandroidx/appcompat/widget/Toolbar$SavedState;->()V PLandroidx/appcompat/widget/Toolbar$SavedState;->(Landroid/os/Parcelable;)V PLandroidx/appcompat/widget/Toolbar$SavedState;->writeToParcel(Landroid/os/Parcel;I)V PLandroidx/appcompat/widget/Toolbar;->(Landroid/content/Context;Landroid/util/AttributeSet;)V PLandroidx/appcompat/widget/Toolbar;->(Landroid/content/Context;Landroid/util/AttributeSet;I)V PLandroidx/appcompat/widget/Toolbar;->addSystemView(Landroid/view/View;Z)V PLandroidx/appcompat/widget/Toolbar;->checkLayoutParams(Landroid/view/ViewGroup$LayoutParams;)Z PLandroidx/appcompat/widget/Toolbar;->ensureContentInsets()V PLandroidx/appcompat/widget/Toolbar;->ensureMenu()V PLandroidx/appcompat/widget/Toolbar;->ensureMenuView()V PLandroidx/appcompat/widget/Toolbar;->generateDefaultLayoutParams()Landroidx/appcompat/widget/Toolbar$LayoutParams; PLandroidx/appcompat/widget/Toolbar;->generateLayoutParams(Landroid/util/AttributeSet;)Landroid/view/ViewGroup$LayoutParams; PLandroidx/appcompat/widget/Toolbar;->getCurrentContentInsetLeft()I PLandroidx/appcompat/widget/Toolbar;->getCurrentContentInsetRight()I PLandroidx/appcompat/widget/Toolbar;->getMenu()Landroid/view/Menu; PLandroidx/appcompat/widget/Toolbar;->getMenuInflater()Landroid/view/MenuInflater; PLandroidx/appcompat/widget/Toolbar;->inflateMenu(I)V PLandroidx/appcompat/widget/Toolbar;->isOverflowMenuShowing()Z PLandroidx/appcompat/widget/Toolbar;->onDetachedFromWindow()V PLandroidx/appcompat/widget/Toolbar;->onRtlPropertiesChanged(I)V PLandroidx/appcompat/widget/Toolbar;->onSaveInstanceState()Landroid/os/Parcelable; PLandroidx/appcompat/widget/Toolbar;->setOnMenuItemClickListener(Landroidx/appcompat/widget/Toolbar$OnMenuItemClickListener;)V PLandroidx/appcompat/widget/Toolbar;->setPopupTheme(I)V PLandroidx/appcompat/widget/Toolbar;->setSubtitleTextColor(Landroid/content/res/ColorStateList;)V PLandroidx/appcompat/widget/Toolbar;->setTitleTextColor(Landroid/content/res/ColorStateList;)V PLandroidx/appcompat/widget/ViewStubCompat;->(Landroid/content/Context;Landroid/util/AttributeSet;)V PLandroidx/appcompat/widget/ViewStubCompat;->setVisibility(I)V PLandroidx/appcompat/widget/ViewUtils;->()V PLandroidx/arch/core/executor/ArchTaskExecutor;->()V PLandroidx/arch/core/executor/ArchTaskExecutor;->()V PLandroidx/arch/core/executor/DefaultTaskExecutor$1;->(Landroidx/arch/core/executor/DefaultTaskExecutor;)V PLandroidx/arch/core/executor/DefaultTaskExecutor$1;->(Ljava/lang/String;Ljava/util/concurrent/atomic/AtomicLong;)V PLandroidx/arch/core/executor/DefaultTaskExecutor$1;->newThread(Ljava/lang/Runnable;)Ljava/lang/Thread; PLandroidx/arch/core/executor/DefaultTaskExecutor;->()V PLandroidx/arch/core/executor/DefaultTaskExecutor;->executeOnDiskIO(Ljava/lang/Runnable;)V PLandroidx/arch/core/internal/FastSafeIterableMap;->()V PLandroidx/arch/core/internal/SafeIterableMap$AscendingIterator;->(Landroidx/arch/core/internal/SafeIterableMap$Entry;Landroidx/arch/core/internal/SafeIterableMap$Entry;I)V PLandroidx/arch/core/internal/SafeIterableMap$Entry;->getKey()Ljava/lang/Object; PLandroidx/arch/core/internal/SafeIterableMap$IteratorWithAdditions;->supportRemove(Landroidx/arch/core/internal/SafeIterableMap$Entry;)V PLandroidx/arch/core/internal/SafeIterableMap$ListIterator;->(Landroidx/arch/core/internal/SafeIterableMap$Entry;Landroidx/arch/core/internal/SafeIterableMap$Entry;)V PLandroidx/arch/core/internal/SafeIterableMap$ListIterator;->hasNext()Z PLandroidx/arch/core/internal/SafeIterableMap;->get(Ljava/lang/Object;)Landroidx/arch/core/internal/SafeIterableMap$Entry; PLandroidx/arch/core/internal/SafeIterableMap;->putIfAbsent(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLandroidx/collection/ArrayMap$1;->(Ljava/lang/Object;I)V PLandroidx/collection/ArrayMap$1;->colGetEntry(II)Ljava/lang/Object; PLandroidx/collection/ArrayMap$1;->colGetSize()I PLandroidx/collection/ArrayMap$1;->colRemoveAt(I)V PLandroidx/collection/ArrayMap;->()V PLandroidx/collection/ArrayMap;->entrySet()Ljava/util/Set; PLandroidx/collection/ArrayMap;->getCollection()Landroidx/collection/MapCollections; PLandroidx/collection/ArrayMap;->keySet()Ljava/util/Set; PLandroidx/collection/ArrayMap;->putAll(Ljava/util/Map;)V PLandroidx/collection/ArrayMap;->values()Ljava/util/Collection; PLandroidx/collection/ArraySet;->()V PLandroidx/collection/ArraySet;->(I)V PLandroidx/collection/ArraySet;->add(Ljava/lang/Object;)Z PLandroidx/collection/ArraySet;->addAll(Ljava/util/Collection;)Z PLandroidx/collection/ArraySet;->allocArrays(I)V PLandroidx/collection/ArraySet;->freeArrays([I[Ljava/lang/Object;I)V PLandroidx/collection/ArraySet;->indexOf(Ljava/lang/Object;I)I PLandroidx/collection/ArraySet;->iterator()Ljava/util/Iterator; PLandroidx/collection/ArraySet;->removeAt(I)Ljava/lang/Object; PLandroidx/collection/ArraySet;->size()I PLandroidx/collection/LongSparseArray;->()V PLandroidx/collection/LongSparseArray;->get(JLjava/lang/Object;)Ljava/lang/Object; PLandroidx/collection/LongSparseArray;->put(JLjava/lang/Object;)V PLandroidx/collection/LruCache;->(I)V PLandroidx/collection/LruCache;->put(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLandroidx/collection/LruCache;->trimToSize(I)V PLandroidx/collection/MapCollections$ArrayIterator;->(Landroidx/collection/MapCollections;I)V PLandroidx/collection/MapCollections$ArrayIterator;->hasNext()Z PLandroidx/collection/MapCollections$ArrayIterator;->next()Ljava/lang/Object; PLandroidx/collection/MapCollections$ArrayIterator;->remove()V PLandroidx/collection/MapCollections$KeySet;->(Landroidx/collection/MapCollections;I)V PLandroidx/collection/MapCollections$KeySet;->iterator()Ljava/util/Iterator; PLandroidx/collection/MapCollections$MapIterator;->(Landroidx/collection/MapCollections;)V PLandroidx/collection/MapCollections$MapIterator;->getKey()Ljava/lang/Object; PLandroidx/collection/MapCollections$MapIterator;->getValue()Ljava/lang/Object; PLandroidx/collection/MapCollections$MapIterator;->hasNext()Z PLandroidx/collection/MapCollections$MapIterator;->next()Ljava/lang/Object; PLandroidx/collection/MapCollections$ValuesCollection;->(Landroidx/collection/MapCollections;)V PLandroidx/collection/MapCollections$ValuesCollection;->iterator()Ljava/util/Iterator; PLandroidx/collection/MapCollections$ValuesCollection;->toArray()[Ljava/lang/Object; PLandroidx/collection/MapCollections;->()V PLandroidx/collection/MapCollections;->toArrayHelper(I)[Ljava/lang/Object; PLandroidx/collection/SimpleArrayMap;->ensureCapacity(I)V PLandroidx/collection/SimpleArrayMap;->equals(Ljava/lang/Object;)Z PLandroidx/collection/SimpleArrayMap;->get(Ljava/lang/Object;)Ljava/lang/Object; PLandroidx/collection/SimpleArrayMap;->hashCode()I PLandroidx/collection/SimpleArrayMap;->isEmpty()Z PLandroidx/collection/SimpleArrayMap;->putAll(Landroidx/collection/SimpleArrayMap;)V PLandroidx/collection/SimpleArrayMap;->size()I PLandroidx/collection/SparseArrayCompat;->()V PLandroidx/collection/SparseArrayCompat;->()V PLandroidx/collection/SparseArrayCompat;->get(I)Ljava/lang/Object; PLandroidx/collection/SparseArrayCompat;->get(ILjava/lang/Object;)Ljava/lang/Object; PLandroidx/collection/SparseArrayCompat;->indexOfValue(Ljava/lang/Object;)I PLandroidx/collection/SparseArrayCompat;->keyAt(I)I PLandroidx/collection/SparseArrayCompat;->put(ILjava/lang/Object;)V PLandroidx/collection/SparseArrayCompat;->size()I PLandroidx/compose/animation/core/AnimationEndReason$EnumUnboxingSharedUtility;->()V PLandroidx/compose/animation/core/AnimationEndReason$EnumUnboxingSharedUtility;->checkNotZero(ILjava/lang/String;)V PLandroidx/compose/animation/core/AnimationEndReason$EnumUnboxingSharedUtility;->equals(II)Z PLandroidx/compose/animation/core/AnimationEndReason$EnumUnboxingSharedUtility;->values(I)[I PLandroidx/compose/animation/core/CubicBezierEasing;->(FFFF)V PLandroidx/compose/material/DrawerKt$Scrim$dismissDrawer$2$1$1;->(Lkotlin/jvm/functions/Function0;I)V PLandroidx/compose/material/DrawerKt$Scrim$dismissDrawer$2$1$1;->invoke()Landroidx/lifecycle/ViewModelStore; PLandroidx/compose/material/DrawerKt$Scrim$dismissDrawer$2$1$1;->invoke()Ljava/lang/Object; PLandroidx/compose/material/FabPlacement;->()V PLandroidx/compose/material/FabPlacement;->(II)V PLandroidx/compose/material/FabPlacement;->(ILorg/threeten/bp/DayOfWeek;Landroidx/room/Room;)V PLandroidx/compose/material/FabPlacement;->adjustInto(Lorg/threeten/bp/temporal/Temporal;)Lorg/threeten/bp/temporal/Temporal; PLandroidx/compose/material/FabPlacement;->onStopNestedScroll(I)V PLandroidx/compose/material/ScaffoldKt$Scaffold$1;->(Ljava/lang/Object;I)V PLandroidx/compose/material/Strings$Companion;->(I)V PLandroidx/compose/material/Strings$Companion;->getEdgePath(FFFLcom/google/android/material/shape/ShapePath;)V PLandroidx/compose/material/SwipeableState$special$$inlined$filter$1$2;->(Lkotlinx/coroutines/flow/FlowCollector;I)V PLandroidx/compose/material/SwipeableState$special$$inlined$filter$1$2;->emit(Lcom/google/samples/apps/iosched/shared/result/Result;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLandroidx/compose/material/SwipeableState$special$$inlined$filter$1;->(Lkotlinx/coroutines/flow/Flow;I)V PLandroidx/compose/material/SwipeableState$special$$inlined$filter$1;->collect(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLandroidx/compose/material/ripple/StateLayer;->(Lcom/google/android/gms/measurement/internal/zzfe;Ljava/lang/String;I)V PLandroidx/compose/material/ripple/StateLayer;->zza()Ljava/lang/String; PLandroidx/compose/material/ripple/StateLayer;->zza(Ljava/lang/String;)V PLandroidx/compose/runtime/ComposerImpl$doCompose$2$5;->(Ljava/lang/Object;Ljava/lang/Object;I)V PLandroidx/compose/runtime/ComposerImpl$doCompose$2$5;->invoke()Ljava/lang/Object; PLandroidx/compose/runtime/ComposerKt$startRootGroup$1;->()V PLandroidx/compose/runtime/ComposerKt$startRootGroup$1;->(I)V PLandroidx/compose/runtime/ComposerKt$startRootGroup$1;->invoke(Landroid/view/View;Landroidx/core/view/WindowInsetsCompat;Lcom/google/samples/apps/iosched/util/ViewPaddingState;)V PLandroidx/compose/runtime/ComposerKt$startRootGroup$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLandroidx/compose/runtime/DisposableEffectScope;->()V PLandroidx/compose/runtime/Latch$await$2$2;->(Ljava/lang/Object;Ljava/lang/Object;I)V PLandroidx/compose/runtime/Latch$await$2$2;->invoke(Ljava/lang/Object;)Ljava/lang/Object; PLandroidx/compose/runtime/Latch;->(I)V PLandroidx/compose/runtime/Latch;->(Lcom/bumptech/glide/disklrucache/DiskLruCache;Lcom/bumptech/glide/disklrucache/DiskLruCache$Entry;)V PLandroidx/compose/runtime/Latch;->(Lcom/bumptech/glide/disklrucache/DiskLruCache;Lcom/bumptech/glide/disklrucache/DiskLruCache$Entry;Lcom/google/firebase/iid/zzy;)V PLandroidx/compose/runtime/Latch;->getTablesToSync()[I PLandroidx/compose/runtime/OpaqueKey;->(Ljava/lang/String;)V PLandroidx/compose/runtime/SnapshotThreadLocal;->(I)V PLandroidx/compose/runtime/SnapshotThreadLocal;->(Landroidx/core/util/Pools$Pool;)V PLandroidx/compose/runtime/SnapshotThreadLocal;->(Landroidx/room/RoomDatabase;)V PLandroidx/compose/runtime/SnapshotThreadLocal;->(Lcom/bumptech/glide/load/model/MultiModelLoaderFactory;)V PLandroidx/compose/runtime/SnapshotThreadLocal;->(Lcom/google/firebase/FirebaseApp;)V PLandroidx/compose/runtime/SnapshotThreadLocal;->(Ljava/lang/Object;Ljava/lang/Object;ILandroidx/appcompat/R$id$$IA$1;)V PLandroidx/compose/runtime/SnapshotThreadLocal;->(Ljava/util/Map;I)V PLandroidx/compose/runtime/SnapshotThreadLocal;->get(Lcom/bumptech/glide/load/engine/bitmap_recycle/Poolable;)Ljava/lang/Object; PLandroidx/compose/runtime/SnapshotThreadLocal;->get(Lcom/google/gson/reflect/TypeToken;)Lcom/google/gson/internal/ObjectConstructor; PLandroidx/compose/runtime/SnapshotThreadLocal;->getModelLoadersForClass(Ljava/lang/Class;)Ljava/util/List; PLandroidx/compose/runtime/SnapshotThreadLocal;->makeHead(Lcom/bumptech/glide/load/engine/bitmap_recycle/GroupedLinkedMap$LinkedEntry;)V PLandroidx/compose/runtime/SnapshotThreadLocal;->newDefaultConstructor(Ljava/lang/Class;)Lcom/google/gson/internal/ObjectConstructor; PLandroidx/compose/runtime/SnapshotThreadLocal;->newDefaultImplementationConstructor(Ljava/lang/reflect/Type;Ljava/lang/Class;)Lcom/google/gson/internal/ObjectConstructor; PLandroidx/compose/runtime/SnapshotThreadLocal;->positionForDay(Lcom/google/samples/apps/iosched/model/ConferenceDay;)I PLandroidx/compose/runtime/SnapshotThreadLocal;->put(Lcom/bumptech/glide/load/engine/bitmap_recycle/Poolable;Ljava/lang/Object;)V PLandroidx/compose/runtime/SnapshotThreadLocal;->then(Lcom/google/android/gms/tasks/Task;)Ljava/lang/Object; PLandroidx/compose/runtime/Stack;->(J)V PLandroidx/compose/runtime/Stack;->(Lcom/google/android/gms/internal/measurement/zzel$zza;)V PLandroidx/compose/runtime/Stack;->(Ljava/lang/Object;I)V PLandroidx/compose/runtime/Stack;->build(Landroid/net/Uri;)Lcom/bumptech/glide/load/data/DataFetcher; PLandroidx/compose/runtime/Stack;->build(Lcom/bumptech/glide/load/model/MultiModelLoaderFactory;)Lcom/bumptech/glide/load/model/ModelLoader; PLandroidx/compose/runtime/Stack;->create()Ljava/lang/Object; PLandroidx/compose/runtime/Stack;->getUInt16()I PLandroidx/compose/runtime/Stack;->onApplyWindowInsets(Landroid/view/View;Landroidx/core/view/WindowInsetsCompat;)Landroidx/core/view/WindowInsetsCompat; PLandroidx/compose/runtime/Stack;->zza(IJ)V PLandroidx/compose/runtime/Stack;->zzc(II)V PLandroidx/compose/runtime/internal/ThreadMap;->(I[J[Ljava/lang/Object;)V PLandroidx/compose/ui/BiasAlignment$Horizontal;->(F)V PLandroidx/compose/ui/BiasAlignment$Vertical;->(F)V PLandroidx/compose/ui/BiasAlignment;->(FF)V PLandroidx/compose/ui/graphics/RectangleShapeKt$RectangleShape$1;->()V PLandroidx/compose/ui/graphics/colorspace/WhitePoint;->(FF)V PLandroidx/compose/ui/layout/SubcomposeLayoutState$subcompose$2;->(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;I)V PLandroidx/compose/ui/layout/SubcomposeLayoutState$subcompose$2;->invoke()Ljava/lang/Object; PLandroidx/compose/ui/unit/DensityImpl;->(FF)V PLandroidx/constraintlayout/solver/PriorityGoalRow$GoalVariableAccessor;->(Landroidx/constraintlayout/solver/PriorityGoalRow;Landroidx/constraintlayout/solver/PriorityGoalRow;)V PLandroidx/constraintlayout/solver/widgets/Barrier;->()V PLandroidx/constraintlayout/solver/widgets/ConstraintAnchor$Type;->()V PLandroidx/constraintlayout/solver/widgets/ConstraintAnchor$Type;->(Ljava/lang/String;I)V PLandroidx/constraintlayout/solver/widgets/ConstraintWidget;->getBottom()I PLandroidx/constraintlayout/solver/widgets/HelperWidget;->()V PLandroidx/constraintlayout/solver/widgets/analyzer/BasicMeasure$Measure;->()V PLandroidx/constraintlayout/solver/widgets/analyzer/HorizontalWidgetRun;->()V PLandroidx/constraintlayout/widget/Barrier;->(Landroid/content/Context;Landroid/util/AttributeSet;)V PLandroidx/constraintlayout/widget/Barrier;->setType(I)V PLandroidx/constraintlayout/widget/ConstraintLayout$LayoutParams$Table;->()V PLandroidx/constraintlayout/widget/ConstraintLayout$Measurer;->(Landroidx/constraintlayout/widget/ConstraintLayout;Landroidx/constraintlayout/widget/ConstraintLayout;)V PLandroidx/constraintlayout/widget/ConstraintLayout;->addView(Landroid/view/View;ILandroid/view/ViewGroup$LayoutParams;)V PLandroidx/constraintlayout/widget/ConstraintLayout;->checkLayoutParams(Landroid/view/ViewGroup$LayoutParams;)Z PLandroidx/constraintlayout/widget/Guideline;->(Landroid/content/Context;Landroid/util/AttributeSet;)V PLandroidx/coordinatorlayout/widget/CoordinatorLayout$Behavior;->()V PLandroidx/coordinatorlayout/widget/CoordinatorLayout$Behavior;->(Landroid/content/Context;Landroid/util/AttributeSet;)V PLandroidx/coordinatorlayout/widget/CoordinatorLayout$Behavior;->blocksInteractionBelow(Landroidx/coordinatorlayout/widget/CoordinatorLayout;Landroid/view/View;)Z PLandroidx/coordinatorlayout/widget/CoordinatorLayout$Behavior;->getScrimOpacity(Landroidx/coordinatorlayout/widget/CoordinatorLayout;Landroid/view/View;)F PLandroidx/coordinatorlayout/widget/CoordinatorLayout$Behavior;->layoutDependsOn(Landroidx/coordinatorlayout/widget/CoordinatorLayout;Landroid/view/View;Landroid/view/View;)Z PLandroidx/coordinatorlayout/widget/CoordinatorLayout$Behavior;->onAttachedToLayoutParams(Landroidx/coordinatorlayout/widget/CoordinatorLayout$LayoutParams;)V PLandroidx/coordinatorlayout/widget/CoordinatorLayout$Behavior;->onInterceptTouchEvent(Landroidx/coordinatorlayout/widget/CoordinatorLayout;Landroid/view/View;Landroid/view/MotionEvent;)Z PLandroidx/coordinatorlayout/widget/CoordinatorLayout$Behavior;->onMeasureChild(Landroidx/coordinatorlayout/widget/CoordinatorLayout;Landroid/view/View;IIII)Z PLandroidx/coordinatorlayout/widget/CoordinatorLayout$Behavior;->onSaveInstanceState(Landroidx/coordinatorlayout/widget/CoordinatorLayout;Landroid/view/View;)Landroid/os/Parcelable; PLandroidx/coordinatorlayout/widget/CoordinatorLayout$Behavior;->onStartNestedScroll(Landroidx/coordinatorlayout/widget/CoordinatorLayout;Landroid/view/View;Landroid/view/View;Landroid/view/View;I)Z PLandroidx/coordinatorlayout/widget/CoordinatorLayout$Behavior;->onStartNestedScroll(Landroidx/coordinatorlayout/widget/CoordinatorLayout;Landroid/view/View;Landroid/view/View;Landroid/view/View;II)Z PLandroidx/coordinatorlayout/widget/CoordinatorLayout$Behavior;->onTouchEvent(Landroidx/coordinatorlayout/widget/CoordinatorLayout;Landroid/view/View;Landroid/view/MotionEvent;)Z PLandroidx/coordinatorlayout/widget/CoordinatorLayout$HierarchyChangeListener;->(Landroidx/coordinatorlayout/widget/CoordinatorLayout;)V PLandroidx/coordinatorlayout/widget/CoordinatorLayout$HierarchyChangeListener;->onChildViewAdded(Landroid/view/View;Landroid/view/View;)V PLandroidx/coordinatorlayout/widget/CoordinatorLayout$LayoutParams;->setBehavior(Landroidx/coordinatorlayout/widget/CoordinatorLayout$Behavior;)V PLandroidx/coordinatorlayout/widget/CoordinatorLayout$LayoutParams;->setNestedScrollAccepted(IZ)V PLandroidx/coordinatorlayout/widget/CoordinatorLayout$SavedState;->()V PLandroidx/coordinatorlayout/widget/CoordinatorLayout$SavedState;->(Landroid/os/Parcelable;)V PLandroidx/coordinatorlayout/widget/CoordinatorLayout$SavedState;->writeToParcel(Landroid/os/Parcel;I)V PLandroidx/coordinatorlayout/widget/CoordinatorLayout;->()V PLandroidx/coordinatorlayout/widget/CoordinatorLayout;->(Landroid/content/Context;Landroid/util/AttributeSet;)V PLandroidx/coordinatorlayout/widget/CoordinatorLayout;->checkLayoutParams(Landroid/view/ViewGroup$LayoutParams;)Z PLandroidx/coordinatorlayout/widget/CoordinatorLayout;->drawableStateChanged()V PLandroidx/coordinatorlayout/widget/CoordinatorLayout;->generateLayoutParams(Landroid/util/AttributeSet;)Landroid/view/ViewGroup$LayoutParams; PLandroidx/coordinatorlayout/widget/CoordinatorLayout;->isPointInChildBounds(Landroid/view/View;II)Z PLandroidx/coordinatorlayout/widget/CoordinatorLayout;->onAttachedToWindow()V PLandroidx/coordinatorlayout/widget/CoordinatorLayout;->onDetachedFromWindow()V PLandroidx/coordinatorlayout/widget/CoordinatorLayout;->onDraw(Landroid/graphics/Canvas;)V PLandroidx/coordinatorlayout/widget/CoordinatorLayout;->onInterceptTouchEvent(Landroid/view/MotionEvent;)Z PLandroidx/coordinatorlayout/widget/CoordinatorLayout;->onSaveInstanceState()Landroid/os/Parcelable; PLandroidx/coordinatorlayout/widget/CoordinatorLayout;->onStartNestedScroll(Landroid/view/View;Landroid/view/View;II)Z PLandroidx/coordinatorlayout/widget/CoordinatorLayout;->requestDisallowInterceptTouchEvent(Z)V PLandroidx/coordinatorlayout/widget/CoordinatorLayout;->resetTouchBehaviors(Z)V PLandroidx/coordinatorlayout/widget/CoordinatorLayout;->setVisibility(I)V PLandroidx/coordinatorlayout/widget/CoordinatorLayout;->setupForInsets()V PLandroidx/coordinatorlayout/widget/ViewGroupUtils;->()V PLandroidx/core/R$dimen;->()V PLandroidx/core/R$dimen;->()V PLandroidx/core/R$dimen;->binarySearch([JIJ)I PLandroidx/core/R$dimen;->buildSingleThreadExecutorService(Ljava/lang/String;)Ljava/util/concurrent/ExecutorService; PLandroidx/core/R$dimen;->checkArgument(Z)V PLandroidx/core/R$dimen;->checkEntryNotNull(Ljava/lang/Object;Ljava/lang/Object;)V PLandroidx/core/R$dimen;->checkNonnegative(ILjava/lang/String;)I PLandroidx/core/R$dimen;->getControlPoint([Ljava/lang/String;I)F PLandroidx/core/R$dimen;->getFont(Landroid/content/Context;I)Landroid/graphics/Typeface; PLandroidx/core/R$dimen;->idealByteArraySize(I)I PLandroidx/core/R$dimen;->idealIntArraySize(I)I PLandroidx/core/R$dimen;->idealLongArraySize(I)I PLandroidx/core/R$dimen;->isEasingType(Ljava/lang/String;Ljava/lang/String;)Z PLandroidx/core/R$dimen;->isInstantApp(Landroid/content/Context;)Z PLandroidx/core/R$dimen;->resolveThemeDuration(Landroid/content/Context;II)I PLandroidx/core/R$dimen;->resolveThemeInterpolator(Landroid/content/Context;ILandroid/animation/TimeInterpolator;)Landroid/animation/TimeInterpolator; PLandroidx/core/R$dimen;->setTooltipText(Landroid/view/View;Ljava/lang/CharSequence;)V PLandroidx/core/R$dimen;->zza(Ljava/lang/String;)Ljava/util/concurrent/Executor; PLandroidx/core/R$id;->()V PLandroidx/core/R$id;->CoroutineScope(Lkotlin/coroutines/CoroutineContext;)Lkotlinx/coroutines/CoroutineScope; PLandroidx/core/R$id;->checkAttribute(Landroid/content/res/TypedArray;I)V PLandroidx/core/R$id;->close$default(Lkotlinx/coroutines/channels/SendChannel;Ljava/lang/Throwable;ILjava/lang/Object;)Z PLandroidx/core/R$id;->createBundle(Landroid/os/Parcel;I)Landroid/os/Bundle; PLandroidx/core/R$id;->createParcelable(Landroid/os/Parcel;ILandroid/os/Parcelable$Creator;)Landroid/os/Parcelable; PLandroidx/core/R$id;->createString(Landroid/os/Parcel;I)Ljava/lang/String; PLandroidx/core/R$id;->createViewModelLazy(Landroidx/fragment/app/Fragment;Lkotlin/reflect/KClass;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;)Lkotlin/Lazy; PLandroidx/core/R$id;->disposeOnCancellation(Lkotlinx/coroutines/CancellableContinuation;Lkotlinx/coroutines/DisposableHandle;)V PLandroidx/core/R$id;->doOnApplyWindowInsets(Landroid/view/View;Lkotlin/jvm/functions/Function3;)V PLandroidx/core/R$id;->ensureAtEnd(Landroid/os/Parcel;I)V PLandroidx/core/R$id;->findNavController(Landroid/view/View;)Landroidx/navigation/NavHostController; PLandroidx/core/R$id;->getActivityFactory(Landroidx/activity/ComponentActivity;Landroidx/lifecycle/ViewModelProvider$Factory;)Landroidx/lifecycle/ViewModelProvider$Factory; PLandroidx/core/R$id;->getFragmentFactory(Landroidx/fragment/app/Fragment;Landroidx/lifecycle/ViewModelProvider$Factory;)Landroidx/lifecycle/ViewModelProvider$Factory; PLandroidx/core/R$id;->launchSharing$FlowKt__ShareKt(Lkotlinx/coroutines/CoroutineScope;Lkotlin/coroutines/CoroutineContext;Lkotlinx/coroutines/flow/Flow;Lkotlinx/coroutines/flow/MutableSharedFlow;Lkotlinx/coroutines/flow/SharingStarted;Ljava/lang/Object;)Lkotlinx/coroutines/Job; PLandroidx/core/R$id;->lerp(FFF)F PLandroidx/core/R$id;->nextOrSame(Lorg/threeten/bp/DayOfWeek;)Lorg/threeten/bp/temporal/TemporalAdjuster; PLandroidx/core/R$id;->readInt(Landroid/os/Parcel;I)I PLandroidx/core/R$id;->readLong(Landroid/os/Parcel;I)J PLandroidx/core/R$id;->readSize(Landroid/os/Parcel;I)I PLandroidx/core/R$id;->requestApplyInsetsWhenAttached(Landroid/view/View;)V PLandroidx/core/R$id;->setOf(Ljava/lang/Object;)Ljava/util/Set; PLandroidx/core/R$id;->setViewNavController(Landroid/view/View;Landroidx/navigation/NavHostController;)V PLandroidx/core/R$id;->updateForTheme(Landroidx/appcompat/app/AppCompatActivity;Lcom/google/samples/apps/iosched/model/Theme;)V PLandroidx/core/R$id;->validateObjectHeader(Landroid/os/Parcel;)I PLandroidx/core/R$id;->zza(Landroid/os/Parcel;II)V PLandroidx/core/app/ActivityCompat;->()V PLandroidx/core/app/ActivityCompat;->checkSelfPermission(Landroid/content/Context;Ljava/lang/String;)I PLandroidx/core/app/ComponentActivity;->()V PLandroidx/core/app/ComponentActivity;->onCreate(Landroid/os/Bundle;)V PLandroidx/core/app/ComponentActivity;->onSaveInstanceState(Landroid/os/Bundle;)V PLandroidx/core/app/CoreComponentFactory;->()V PLandroidx/core/app/CoreComponentFactory;->instantiateActivity(Ljava/lang/ClassLoader;Ljava/lang/String;Landroid/content/Intent;)Landroid/app/Activity; PLandroidx/core/app/CoreComponentFactory;->instantiateApplication(Ljava/lang/ClassLoader;Ljava/lang/String;)Landroid/app/Application; PLandroidx/core/app/CoreComponentFactory;->instantiateProvider(Ljava/lang/ClassLoader;Ljava/lang/String;)Landroid/content/ContentProvider; PLandroidx/core/app/CoreComponentFactory;->instantiateService(Ljava/lang/ClassLoader;Ljava/lang/String;Landroid/content/Intent;)Landroid/app/Service; PLandroidx/core/content/res/FontResourcesParserCompat$ProviderResourceEntry;->(Landroidx/core/provider/FontRequest;IILjava/lang/String;)V PLandroidx/core/graphics/ColorUtils;->()V PLandroidx/core/graphics/ColorUtils;->setAlphaComponent(II)I PLandroidx/core/graphics/Insets;->()V PLandroidx/core/graphics/Insets;->toPlatformInsets()Landroid/graphics/Insets; PLandroidx/core/graphics/TypefaceCompat;->()V PLandroidx/core/graphics/TypefaceCompatApi29Impl;->()V PLandroidx/core/graphics/TypefaceCompatBaseImpl$1;->(Ljava/lang/Object;I)V PLandroidx/core/graphics/TypefaceCompatBaseImpl$1;->construct()Ljava/lang/Object; PLandroidx/core/os/CancellationSignal;->()V PLandroidx/core/os/CancellationSignal;->setOnCancelListener(Landroidx/core/os/CancellationSignal$OnCancelListener;)V PLandroidx/core/os/TraceCompat;->()V PLandroidx/core/provider/FontRequest;->(Lcom/google/firebase/crashlytics/internal/common/CrashlyticsController;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;I)V PLandroidx/core/provider/FontRequest;->writeTo(Lcom/google/firebase/crashlytics/internal/proto/CodedOutputStream;)V PLandroidx/core/provider/FontRequestWorker$1;->(Ljava/lang/String;Landroid/content/Context;Landroidx/core/provider/FontRequest;II)V PLandroidx/core/provider/FontRequestWorker$1;->call()Landroidx/core/provider/FontRequestWorker$TypefaceResult; PLandroidx/core/provider/FontRequestWorker$1;->call()Ljava/lang/Object; PLandroidx/core/provider/FontRequestWorker$2;->(Ljava/lang/Object;I)V PLandroidx/core/provider/FontRequestWorker$2;->accept(Ljava/lang/Object;)V PLandroidx/core/provider/FontRequestWorker$TypefaceResult;->(I)V PLandroidx/core/provider/FontRequestWorker;->()V PLandroidx/core/provider/FontRequestWorker;->getFontSync(Ljava/lang/String;Landroid/content/Context;Landroidx/core/provider/FontRequest;I)Landroidx/core/provider/FontRequestWorker$TypefaceResult; PLandroidx/core/provider/RequestExecutor$DefaultThreadFactory$ProcessPriorityThread;->(Ljava/lang/Runnable;Ljava/lang/String;I)V PLandroidx/core/provider/RequestExecutor$DefaultThreadFactory$ProcessPriorityThread;->run()V PLandroidx/core/provider/RequestExecutor$DefaultThreadFactory;->(Ljava/lang/String;I)V PLandroidx/core/provider/RequestExecutor$DefaultThreadFactory;->newThread(Ljava/lang/Runnable;)Ljava/lang/Thread; PLandroidx/core/util/Pools$SynchronizedPool;->(I)V PLandroidx/core/view/AccessibilityDelegateCompat$AccessibilityDelegateAdapter;->sendAccessibilityEvent(Landroid/view/View;I)V PLandroidx/core/view/AccessibilityDelegateCompat;->()V PLandroidx/core/view/AccessibilityDelegateCompat;->onInitializeAccessibilityNodeInfo(Landroid/view/View;Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat;)V PLandroidx/core/view/AccessibilityDelegateCompat;->onRequestSendAccessibilityEvent(Landroid/view/ViewGroup;Landroid/view/View;Landroid/view/accessibility/AccessibilityEvent;)Z PLandroidx/core/view/AccessibilityDelegateCompat;->sendAccessibilityEvent(Landroid/view/View;I)V PLandroidx/core/view/NestedScrollingChildHelper;->(Landroid/view/View;)V PLandroidx/core/view/NestedScrollingChildHelper;->dispatchNestedFling(FFZ)Z PLandroidx/core/view/NestedScrollingChildHelper;->dispatchNestedPreFling(FF)Z PLandroidx/core/view/NestedScrollingChildHelper;->dispatchNestedScroll(IIII[I)Z PLandroidx/core/view/NestedScrollingChildHelper;->startNestedScroll(II)Z PLandroidx/core/view/PointerIconCompat;->(Ljava/lang/Object;I)V PLandroidx/core/view/PointerIconCompat;->cleanup()V PLandroidx/core/view/PointerIconCompat;->create(Lcom/google/firebase/components/ComponentContainer;)Ljava/lang/Object; PLandroidx/core/view/PointerIconCompat;->rewindAndGet()Ljava/lang/Object; PLandroidx/core/view/ViewCompat$1;->()V PLandroidx/core/view/ViewCompat$Api21Impl$1;->(Landroid/view/View;Landroidx/core/view/OnApplyWindowInsetsListener;)V PLandroidx/core/view/ViewCompat$Api21Impl$1;->onApplyWindowInsets(Landroid/view/View;Landroid/view/WindowInsets;)Landroid/view/WindowInsets; PLandroidx/core/view/ViewCompat$Api21Impl;->setOnApplyWindowInsetsListener(Landroid/view/View;Landroidx/core/view/OnApplyWindowInsetsListener;)V PLandroidx/core/view/ViewCompat;->()V PLandroidx/core/view/ViewCompat;->dispatchApplyWindowInsets(Landroid/view/View;Landroidx/core/view/WindowInsetsCompat;)Landroidx/core/view/WindowInsetsCompat; PLandroidx/core/view/ViewCompat;->getActionList(Landroid/view/View;)Ljava/util/List; PLandroidx/core/view/ViewCompat;->onApplyWindowInsets(Landroid/view/View;Landroidx/core/view/WindowInsetsCompat;)Landroidx/core/view/WindowInsetsCompat; PLandroidx/core/view/ViewCompat;->removeActionWithId(ILandroid/view/View;)V PLandroidx/core/view/ViewConfigurationCompat;->()V PLandroidx/core/view/WindowInsetsCompat$BuilderImpl29;->()V PLandroidx/core/view/WindowInsetsCompat$BuilderImpl29;->(Landroidx/core/view/WindowInsetsCompat;)V PLandroidx/core/view/WindowInsetsCompat$BuilderImpl29;->build()Landroidx/core/view/WindowInsetsCompat; PLandroidx/core/view/WindowInsetsCompat$BuilderImpl30;->()V PLandroidx/core/view/WindowInsetsCompat$BuilderImpl30;->(Landroidx/core/view/WindowInsetsCompat;)V PLandroidx/core/view/WindowInsetsCompat$BuilderImpl30;->setInsets(ILandroidx/core/graphics/Insets;)V PLandroidx/core/view/WindowInsetsCompat$BuilderImpl;->()V PLandroidx/core/view/WindowInsetsCompat$BuilderImpl;->(Landroidx/core/view/WindowInsetsCompat;)V PLandroidx/core/view/WindowInsetsCompat$BuilderImpl;->applyInsetTypes()V PLandroidx/core/view/WindowInsetsCompat$Impl20;->setOverriddenInsets([Landroidx/core/graphics/Insets;)V PLandroidx/core/view/WindowInsetsCompat$Impl20;->setRootWindowInsets(Landroidx/core/view/WindowInsetsCompat;)V PLandroidx/core/view/WindowInsetsCompat$Impl21;->consumeStableInsets()Landroidx/core/view/WindowInsetsCompat; PLandroidx/core/view/WindowInsetsCompat$Impl21;->consumeSystemWindowInsets()Landroidx/core/view/WindowInsetsCompat; PLandroidx/core/view/WindowInsetsCompat$Impl21;->isConsumed()Z PLandroidx/core/view/WindowInsetsCompat$Impl28;->(Landroidx/core/view/WindowInsetsCompat;Landroid/view/WindowInsets;)V PLandroidx/core/view/WindowInsetsCompat$Impl28;->consumeDisplayCutout()Landroidx/core/view/WindowInsetsCompat; PLandroidx/core/view/WindowInsetsCompat$Impl28;->equals(Ljava/lang/Object;)Z PLandroidx/core/view/WindowInsetsCompat$Impl30;->()V PLandroidx/core/view/WindowInsetsCompat$Impl30;->(Landroidx/core/view/WindowInsetsCompat;Landroid/view/WindowInsets;)V PLandroidx/core/view/WindowInsetsCompat$Impl30;->copyRootViewBounds(Landroid/view/View;)V PLandroidx/core/view/WindowInsetsCompat$Impl30;->getInsets(I)Landroidx/core/graphics/Insets; PLandroidx/core/view/WindowInsetsCompat$Impl30;->isVisible(I)Z PLandroidx/core/view/WindowInsetsCompat$Impl;->()V PLandroidx/core/view/WindowInsetsCompat$TypeImpl30;->toPlatformType(I)I PLandroidx/core/view/WindowInsetsCompat;->()V PLandroidx/core/view/WindowInsetsCompat;->(Landroidx/core/view/WindowInsetsCompat;)V PLandroidx/core/view/WindowInsetsCompat;->consumeSystemWindowInsets()Landroidx/core/view/WindowInsetsCompat; PLandroidx/core/view/WindowInsetsCompat;->equals(Ljava/lang/Object;)Z PLandroidx/core/view/WindowInsetsCompat;->getInsets(I)Landroidx/core/graphics/Insets; PLandroidx/core/view/WindowInsetsCompat;->isConsumed()Z PLandroidx/core/view/WindowInsetsCompat;->toWindowInsets()Landroid/view/WindowInsets; PLandroidx/core/view/WindowInsetsCompat;->toWindowInsetsCompat(Landroid/view/WindowInsets;)Landroidx/core/view/WindowInsetsCompat; PLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat$AccessibilityActionCompat;->()V PLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat$AccessibilityActionCompat;->(ILjava/lang/CharSequence;)V PLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat$AccessibilityActionCompat;->(ILjava/lang/CharSequence;Ljava/lang/Class;)V PLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat$AccessibilityActionCompat;->(Ljava/lang/Object;ILjava/lang/CharSequence;Landroidx/core/view/accessibility/AccessibilityViewCommand;Ljava/lang/Class;)V PLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat$AccessibilityActionCompat;->getId()I PLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat$CollectionInfoCompat;->(Ljava/lang/Object;)V PLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat$CollectionInfoCompat;->obtain(IIZI)Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat$CollectionInfoCompat; PLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat$CollectionItemInfoCompat;->(Ljava/lang/Object;)V PLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->getActions()I PLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->getClassName()Ljava/lang/CharSequence; PLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->getContentDescription()Ljava/lang/CharSequence; PLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->isEnabled()Z PLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->isFocusable()Z PLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->isFocused()Z PLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->setCollectionInfo(Ljava/lang/Object;)V PLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->setParent(Landroid/view/View;)V PLandroidx/core/widget/AutoSizeableTextView;->()V PLandroidx/customview/view/AbsSavedState$1;->()V PLandroidx/customview/view/AbsSavedState$2;->(I)V PLandroidx/customview/view/AbsSavedState;->()V PLandroidx/customview/view/AbsSavedState;->(Landroid/os/Parcelable;)V PLandroidx/customview/view/AbsSavedState;->(Landroidx/customview/view/AbsSavedState$1;)V PLandroidx/customview/widget/ViewDragHelper;->()V PLandroidx/customview/widget/ViewDragHelper;->(Landroid/content/Context;Landroid/view/ViewGroup;Lkotlin/TuplesKt;)V PLandroidx/customview/widget/ViewDragHelper;->cancel()V PLandroidx/customview/widget/ViewDragHelper;->checkNewEdgeDrag(FFII)Z PLandroidx/customview/widget/ViewDragHelper;->checkTouchSlop(Landroid/view/View;FF)Z PLandroidx/customview/widget/ViewDragHelper;->continueSettling(Z)Z PLandroidx/customview/widget/ViewDragHelper;->create(Landroid/view/ViewGroup;FLkotlin/TuplesKt;)Landroidx/customview/widget/ViewDragHelper; PLandroidx/customview/widget/ViewDragHelper;->findTopChildUnder(II)Landroid/view/View; PLandroidx/customview/widget/ViewDragHelper;->isValidPointerForActionMove(I)Z PLandroidx/customview/widget/ViewDragHelper;->isViewUnder(Landroid/view/View;II)Z PLandroidx/customview/widget/ViewDragHelper;->reportNewEdgeDrags(FFI)V PLandroidx/customview/widget/ViewDragHelper;->saveInitialMotion(FFI)V PLandroidx/customview/widget/ViewDragHelper;->saveLastMotion(Landroid/view/MotionEvent;)V PLandroidx/databinding/BaseObservable;->()V PLandroidx/databinding/DataBinderMapper;->()V PLandroidx/databinding/DataBinderMapperImpl;->()V PLandroidx/databinding/DataBindingUtil;->()V PLandroidx/databinding/DataBindingUtil;->bind(Landroidx/databinding/DataBindingComponent;Landroid/view/View;I)Landroidx/databinding/ViewDataBinding; PLandroidx/databinding/DataBindingUtil;->inflate(Landroid/view/LayoutInflater;ILandroid/view/ViewGroup;ZLandroidx/databinding/DataBindingComponent;)Landroidx/databinding/ViewDataBinding; PLandroidx/databinding/MergedDataBinderMapper;->()V PLandroidx/databinding/MergedDataBinderMapper;->addMapper(Landroidx/databinding/DataBinderMapper;)V PLandroidx/databinding/ViewDataBinding$1;->()V PLandroidx/databinding/ViewDataBinding$1;->(I)V PLandroidx/databinding/ViewDataBinding$6;->(I)V PLandroidx/databinding/ViewDataBinding$6;->onViewDetachedFromWindow(Landroid/view/View;)V PLandroidx/databinding/ViewDataBinding$7;->(Landroidx/databinding/ViewDataBinding;)V PLandroidx/databinding/ViewDataBinding$8;->(Landroidx/databinding/ViewDataBinding;)V PLandroidx/databinding/ViewDataBinding$OnStartListener;->(Landroidx/databinding/ViewDataBinding;Landroidx/databinding/ViewDataBinding$1;)V PLandroidx/databinding/ViewDataBinding$OnStartListener;->onStart()V PLandroidx/databinding/ViewDataBinding;->()V PLandroidx/databinding/ViewDataBinding;->checkAndCastToBindingComponent(Ljava/lang/Object;)Landroidx/databinding/DataBindingComponent; PLandroidx/databinding/ViewDataBinding;->inflateInternal(Landroid/view/LayoutInflater;ILandroid/view/ViewGroup;ZLjava/lang/Object;)Landroidx/databinding/ViewDataBinding; PLandroidx/databinding/ViewDataBinding;->mapBindings(Landroidx/databinding/DataBindingComponent;Landroid/view/View;ILcom/google/firebase/iid/zzk;Landroid/util/SparseIntArray;)[Ljava/lang/Object; PLandroidx/databinding/ViewDataBinding;->parseTagInt(Ljava/lang/String;I)I PLandroidx/databinding/ViewDataBinding;->updateRegistration(ILjava/lang/Object;Landroidx/databinding/CreateWeakListener;)Z PLandroidx/databinding/ViewDataBindingKtx$StateFlowListener$startCollection$1$invokeSuspend$$inlined$collect$1;->(Landroidx/databinding/ViewDataBindingKtx$StateFlowListener$startCollection$1;)V PLandroidx/databinding/ViewDataBindingKtx$StateFlowListener;->(Landroidx/databinding/ViewDataBinding;ILjava/lang/ref/ReferenceQueue;)V PLandroidx/databinding/ViewDataBindingKtx$StateFlowListener;->addListener(Ljava/lang/Object;)V PLandroidx/databinding/ViewDataBindingKtx;->()V PLandroidx/databinding/ViewDataBindingKtx;->updateStateFlowRegistration(Landroidx/databinding/ViewDataBinding;ILkotlinx/coroutines/flow/Flow;)Z PLandroidx/databinding/ViewStubProxy;->()V PLandroidx/databinding/ViewStubProxy;->(Lcom/bumptech/glide/load/engine/executor/GlideExecutor;Lcom/bumptech/glide/load/engine/executor/GlideExecutor;Lcom/bumptech/glide/load/engine/executor/GlideExecutor;Lcom/bumptech/glide/load/engine/executor/GlideExecutor;Lcom/bumptech/glide/load/engine/EngineJobListener;)V PLandroidx/databinding/ViewStubProxy;->(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V PLandroidx/databinding/ViewStubProxy;->build(Lcom/bumptech/glide/load/Key;ZZZZ)Lcom/bumptech/glide/load/engine/EngineJob; PLandroidx/databinding/WeakListener;->(Landroidx/databinding/ViewDataBinding;ILandroidx/databinding/ObservableReference;Ljava/lang/ref/ReferenceQueue;)V PLandroidx/databinding/WeakListener;->getBinder()Landroidx/databinding/ViewDataBinding; PLandroidx/databinding/WeakListener;->unregister()Z PLandroidx/databinding/library/baseAdapters/DataBinderMapperImpl;->()V PLandroidx/databinding/library/baseAdapters/DataBinderMapperImpl;->()V PLandroidx/databinding/library/baseAdapters/DataBinderMapperImpl;->collectDependencies()Ljava/util/List; PLandroidx/datastore/core/Data;->(Ljava/lang/Object;I)V PLandroidx/datastore/core/DataMigrationInitializer$Companion$getInitializer$1;->(Ljava/util/List;Lkotlin/coroutines/Continuation;)V PLandroidx/datastore/core/DataMigrationInitializer$Companion$getInitializer$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLandroidx/datastore/core/DataMigrationInitializer$Companion$getInitializer$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLandroidx/datastore/core/DataMigrationInitializer$Companion$runMigrations$1;->(Lcom/bumptech/glide/load/Option$1;Lkotlin/coroutines/Continuation;)V PLandroidx/datastore/core/DataMigrationInitializer$Companion$runMigrations$2;->(Ljava/util/List;Ljava/util/List;Lkotlin/coroutines/Continuation;)V PLandroidx/datastore/core/DataMigrationInitializer$Companion$runMigrations$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLandroidx/datastore/core/DataMigrationInitializer$Companion$runMigrations$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLandroidx/datastore/core/SimpleActor$1;->(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;I)V PLandroidx/datastore/core/SimpleActor$offer$1;->(Lcom/google/firebase/iid/zzaw;Lkotlin/coroutines/Continuation;)V PLandroidx/datastore/core/SimpleActor$offer$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; PLandroidx/datastore/core/SimpleActor$offer$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLandroidx/datastore/core/SingleProcessDataStore$Message$Read;->(Landroidx/datastore/core/State;)V PLandroidx/datastore/core/SingleProcessDataStore$Message;->(Lkotlin/LazyKt__LazyKt;)V PLandroidx/datastore/core/SingleProcessDataStore$actor$3;->(Landroidx/datastore/core/SingleProcessDataStore;Lkotlin/coroutines/Continuation;)V PLandroidx/datastore/core/SingleProcessDataStore$actor$3;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLandroidx/datastore/core/SingleProcessDataStore$actor$3;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLandroidx/datastore/core/SingleProcessDataStore$data$1$1;->(Landroidx/datastore/core/State;Lkotlin/coroutines/Continuation;)V PLandroidx/datastore/core/SingleProcessDataStore$data$1$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLandroidx/datastore/core/SingleProcessDataStore$data$1$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLandroidx/datastore/core/SingleProcessDataStore$data$1$invokeSuspend$$inlined$map$1$2$1;->(Lkotlinx/coroutines/flow/StartedLazily$command$1$1;Lkotlin/coroutines/Continuation;)V PLandroidx/datastore/core/SingleProcessDataStore$data$1;->(Landroidx/datastore/core/SingleProcessDataStore;Lkotlin/coroutines/Continuation;)V PLandroidx/datastore/core/SingleProcessDataStore$data$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLandroidx/datastore/core/SingleProcessDataStore$handleRead$1;->(Landroidx/datastore/core/SingleProcessDataStore;Lkotlin/coroutines/Continuation;)V PLandroidx/datastore/core/SingleProcessDataStore$readAndInit$1;->(Landroidx/datastore/core/SingleProcessDataStore;Lkotlin/coroutines/Continuation;)V PLandroidx/datastore/core/SingleProcessDataStore$readAndInit$api$1$updateData$1;->(Landroidx/datastore/core/SingleProcessDataStore$readAndInit$api$1;Lkotlin/coroutines/Continuation;)V PLandroidx/datastore/core/SingleProcessDataStore$readAndInit$api$1;->(Landroidx/datastore/core/SingleProcessDataStore;Lkotlinx/coroutines/sync/Mutex;Lkotlin/jvm/internal/Ref$BooleanRef;Lkotlin/jvm/internal/Ref$ObjectRef;)V PLandroidx/datastore/core/SingleProcessDataStore$readAndInit$api$1;->updateData(Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLandroidx/datastore/core/SingleProcessDataStore$readAndInitOrPropagateFailure$1;->(Landroidx/datastore/core/SingleProcessDataStore;Lkotlin/coroutines/Continuation;)V PLandroidx/datastore/core/SingleProcessDataStore$readData$1;->(Landroidx/datastore/core/SingleProcessDataStore;Lkotlin/coroutines/Continuation;)V PLandroidx/datastore/core/SingleProcessDataStore$readDataOrHandleCorruption$1;->(Landroidx/datastore/core/SingleProcessDataStore;Lkotlin/coroutines/Continuation;)V PLandroidx/datastore/core/SingleProcessDataStore;->()V PLandroidx/datastore/core/SingleProcessDataStore;->(Lkotlin/jvm/functions/Function0;Landroidx/datastore/core/Serializer;Ljava/util/List;Landroidx/datastore/core/CorruptionHandler;Lkotlinx/coroutines/CoroutineScope;)V PLandroidx/datastore/core/SingleProcessDataStore;->getData()Lkotlinx/coroutines/flow/Flow; PLandroidx/datastore/core/SingleProcessDataStore;->getFile()Ljava/io/File; PLandroidx/datastore/core/SingleProcessDataStore;->handleRead(Landroidx/datastore/core/SingleProcessDataStore$Message$Read;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLandroidx/datastore/core/SingleProcessDataStore;->readAndInit(Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLandroidx/datastore/core/SingleProcessDataStore;->readAndInitOrPropagateFailure(Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLandroidx/datastore/core/SingleProcessDataStore;->readData(Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLandroidx/datastore/core/SingleProcessDataStore;->readDataOrHandleCorruption(Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLandroidx/datastore/core/State;->(Lkotlin/LazyKt__LazyKt;)V PLandroidx/datastore/core/UnInitialized;->()V PLandroidx/datastore/core/UnInitialized;->()V PLandroidx/datastore/migrations/SharedPreferencesMigration$shouldMigrate$1;->(Landroidx/datastore/migrations/SharedPreferencesMigration;Lkotlin/coroutines/Continuation;)V PLandroidx/datastore/migrations/SharedPreferencesMigration;->(Landroid/content/Context;Ljava/lang/String;Ljava/util/Set;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function3;)V PLandroidx/datastore/migrations/SharedPreferencesMigration;->getKeySet()Ljava/util/Set; PLandroidx/datastore/migrations/SharedPreferencesMigration;->getSharedPrefs()Landroid/content/SharedPreferences; PLandroidx/datastore/migrations/SharedPreferencesMigration;->shouldMigrate(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLandroidx/datastore/migrations/SharedPreferencesMigrationKt;->()V PLandroidx/datastore/preferences/PreferenceDataStoreSingletonDelegate;->(Ljava/lang/String;Lkotlin/jvm/functions/Function1;Lkotlinx/coroutines/CoroutineScope;)V PLandroidx/datastore/preferences/PreferencesMapCompat;->()V PLandroidx/datastore/preferences/PreferencesProto$PreferenceMap$PreferencesDefaultEntryHolder;->()V PLandroidx/datastore/preferences/PreferencesProto$PreferenceMap;->()V PLandroidx/datastore/preferences/PreferencesProto$PreferenceMap;->()V PLandroidx/datastore/preferences/PreferencesProto$PreferenceMap;->dynamicMethod(Landroidx/datastore/preferences/protobuf/GeneratedMessageLite$MethodToInvoke;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLandroidx/datastore/preferences/PreferencesProto$PreferenceMap;->getPreferencesMap()Ljava/util/Map; PLandroidx/datastore/preferences/PreferencesProto$PreferenceMap;->parseFrom(Ljava/io/InputStream;)Landroidx/datastore/preferences/PreferencesProto$PreferenceMap; PLandroidx/datastore/preferences/PreferencesProto$Value;->()V PLandroidx/datastore/preferences/PreferencesProto$Value;->()V PLandroidx/datastore/preferences/PreferencesProto$Value;->dynamicMethod(Landroidx/datastore/preferences/protobuf/GeneratedMessageLite$MethodToInvoke;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLandroidx/datastore/preferences/PreferencesProto$Value;->getBoolean()Z PLandroidx/datastore/preferences/PreferencesProto$Value;->getDefaultInstance()Landroidx/datastore/preferences/PreferencesProto$Value; PLandroidx/datastore/preferences/PreferencesProto$Value;->getValueCase$enumunboxing$()I PLandroidx/datastore/preferences/SharedPreferencesMigrationKt$getMigrationFunction$1;->(Lkotlin/coroutines/Continuation;)V PLandroidx/datastore/preferences/SharedPreferencesMigrationKt$getShouldRunMigration$1;->(Ljava/util/Set;Lkotlin/coroutines/Continuation;)V PLandroidx/datastore/preferences/SharedPreferencesMigrationKt$getShouldRunMigration$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLandroidx/datastore/preferences/SharedPreferencesMigrationKt$getShouldRunMigration$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLandroidx/datastore/preferences/SharedPreferencesMigrationKt;->()V PLandroidx/datastore/preferences/core/MutablePreferences;->(Ljava/util/Map;Z)V PLandroidx/datastore/preferences/core/MutablePreferences;->asMap()Ljava/util/Map; PLandroidx/datastore/preferences/core/MutablePreferences;->checkNotFrozen$datastore_preferences_core()V PLandroidx/datastore/preferences/core/MutablePreferences;->equals(Ljava/lang/Object;)Z PLandroidx/datastore/preferences/core/MutablePreferences;->get(Landroidx/datastore/preferences/core/Preferences$Key;)Ljava/lang/Object; PLandroidx/datastore/preferences/core/MutablePreferences;->hashCode()I PLandroidx/datastore/preferences/core/MutablePreferences;->set(Landroidx/datastore/preferences/core/Preferences$Key;Ljava/lang/Object;)V PLandroidx/datastore/preferences/core/MutablePreferences;->setUnchecked$datastore_preferences_core(Landroidx/datastore/preferences/core/Preferences$Key;Ljava/lang/Object;)V PLandroidx/datastore/preferences/core/PreferenceDataStore;->(Landroidx/datastore/core/DataStore;)V PLandroidx/datastore/preferences/core/PreferenceDataStore;->getData()Lkotlinx/coroutines/flow/Flow; PLandroidx/datastore/preferences/core/Preferences$Key;->(Ljava/lang/String;)V PLandroidx/datastore/preferences/core/Preferences$Key;->equals(Ljava/lang/Object;)Z PLandroidx/datastore/preferences/core/Preferences$Key;->hashCode()I PLandroidx/datastore/preferences/protobuf/AbstractMessageLite;->()V PLandroidx/datastore/preferences/protobuf/Android;->()V PLandroidx/datastore/preferences/protobuf/Android;->isOnAndroidDevice()Z PLandroidx/datastore/preferences/protobuf/ByteString$LeafByteString;->()V PLandroidx/datastore/preferences/protobuf/ByteString$LeafByteString;->()V PLandroidx/datastore/preferences/protobuf/ByteString$LiteralByteString;->([B)V PLandroidx/datastore/preferences/protobuf/CodedInputStream$ArrayDecoder;->([BIIZLandroidx/datastore/preferences/protobuf/OneofInfo;)V PLandroidx/datastore/preferences/protobuf/CodedInputStream$ArrayDecoder;->getTotalBytesRead()I PLandroidx/datastore/preferences/protobuf/CodedInputStream$ArrayDecoder;->pushLimit(I)I PLandroidx/datastore/preferences/protobuf/CodedInputStream$ArrayDecoder;->recomputeBufferSizeAfterLimit()V PLandroidx/datastore/preferences/protobuf/CodedInputStream$StreamDecoder;->(Ljava/io/InputStream;ILandroidx/datastore/preferences/protobuf/OneofInfo;)V PLandroidx/datastore/preferences/protobuf/CodedInputStream$StreamDecoder;->checkLastTagWas(I)V PLandroidx/datastore/preferences/protobuf/CodedInputStream$StreamDecoder;->isAtEnd()Z PLandroidx/datastore/preferences/protobuf/CodedInputStream$StreamDecoder;->popLimit(I)V PLandroidx/datastore/preferences/protobuf/CodedInputStream$StreamDecoder;->pushLimit(I)I PLandroidx/datastore/preferences/protobuf/CodedInputStream$StreamDecoder;->readBool()Z PLandroidx/datastore/preferences/protobuf/CodedInputStream$StreamDecoder;->readRawVarint32()I PLandroidx/datastore/preferences/protobuf/CodedInputStream$StreamDecoder;->readRawVarint64()J PLandroidx/datastore/preferences/protobuf/CodedInputStream$StreamDecoder;->readStringRequireUtf8()Ljava/lang/String; PLandroidx/datastore/preferences/protobuf/CodedInputStream$StreamDecoder;->readTag()I PLandroidx/datastore/preferences/protobuf/CodedInputStream$StreamDecoder;->readUInt32()I PLandroidx/datastore/preferences/protobuf/CodedInputStream$StreamDecoder;->recomputeBufferSizeAfterLimit()V PLandroidx/datastore/preferences/protobuf/CodedInputStream$StreamDecoder;->tryRefillBuffer(I)Z PLandroidx/datastore/preferences/protobuf/CodedInputStream;->(Landroidx/datastore/preferences/protobuf/OneofInfo;)V PLandroidx/datastore/preferences/protobuf/CodedInputStream;->newInstance([B)Landroidx/datastore/preferences/protobuf/CodedInputStream; PLandroidx/datastore/preferences/protobuf/CodedInputStreamReader;->(Landroidx/datastore/preferences/protobuf/CodedInputStream;)V PLandroidx/datastore/preferences/protobuf/CodedInputStreamReader;->getFieldNumber()I PLandroidx/datastore/preferences/protobuf/CodedInputStreamReader;->readBool()Z PLandroidx/datastore/preferences/protobuf/CodedInputStreamReader;->readField(Landroidx/datastore/preferences/protobuf/WireFormat$FieldType;Ljava/lang/Class;Landroidx/datastore/preferences/protobuf/ExtensionRegistryLite;)Ljava/lang/Object; PLandroidx/datastore/preferences/protobuf/CodedInputStreamReader;->readMap(Ljava/util/Map;Lcom/google/firebase/iid/zzaw;Landroidx/datastore/preferences/protobuf/ExtensionRegistryLite;)V PLandroidx/datastore/preferences/protobuf/CodedInputStreamReader;->readMessage(Landroidx/datastore/preferences/protobuf/Schema;Landroidx/datastore/preferences/protobuf/ExtensionRegistryLite;)Ljava/lang/Object; PLandroidx/datastore/preferences/protobuf/CodedInputStreamReader;->readMessage(Ljava/lang/Class;Landroidx/datastore/preferences/protobuf/ExtensionRegistryLite;)Ljava/lang/Object; PLandroidx/datastore/preferences/protobuf/CodedInputStreamReader;->readStringRequireUtf8()Ljava/lang/String; PLandroidx/datastore/preferences/protobuf/CodedInputStreamReader;->requireWireType(I)V PLandroidx/datastore/preferences/protobuf/ExtensionRegistryFactory;->()V PLandroidx/datastore/preferences/protobuf/ExtensionRegistryLite;->()V PLandroidx/datastore/preferences/protobuf/ExtensionRegistryLite;->()V PLandroidx/datastore/preferences/protobuf/ExtensionRegistryLite;->getEmptyRegistry()Landroidx/datastore/preferences/protobuf/ExtensionRegistryLite; PLandroidx/datastore/preferences/protobuf/ExtensionSchemaLite;->()V PLandroidx/datastore/preferences/protobuf/ExtensionSchemas;->()V PLandroidx/datastore/preferences/protobuf/GeneratedMessageInfoFactory;->()V PLandroidx/datastore/preferences/protobuf/GeneratedMessageInfoFactory;->()V PLandroidx/datastore/preferences/protobuf/GeneratedMessageInfoFactory;->isSupported(Ljava/lang/Class;)Z PLandroidx/datastore/preferences/protobuf/GeneratedMessageInfoFactory;->messageInfoFor(Ljava/lang/Class;)Landroidx/datastore/preferences/protobuf/MessageInfo; PLandroidx/datastore/preferences/protobuf/GeneratedMessageLite$MethodToInvoke;->()V PLandroidx/datastore/preferences/protobuf/GeneratedMessageLite$MethodToInvoke;->(Ljava/lang/String;I)V PLandroidx/datastore/preferences/protobuf/GeneratedMessageLite;->()V PLandroidx/datastore/preferences/protobuf/GeneratedMessageLite;->()V PLandroidx/datastore/preferences/protobuf/GeneratedMessageLite;->getDefaultInstance(Ljava/lang/Class;)Landroidx/datastore/preferences/protobuf/GeneratedMessageLite; PLandroidx/datastore/preferences/protobuf/GeneratedMessageLite;->isInitialized()Z PLandroidx/datastore/preferences/protobuf/GeneratedMessageLite;->registerDefaultInstance(Ljava/lang/Class;Landroidx/datastore/preferences/protobuf/GeneratedMessageLite;)V PLandroidx/datastore/preferences/protobuf/Internal;->()V PLandroidx/datastore/preferences/protobuf/ListFieldSchema$ListFieldSchemaFull;->()V PLandroidx/datastore/preferences/protobuf/ListFieldSchema$ListFieldSchemaFull;->(Landroidx/datastore/preferences/protobuf/OneofInfo;)V PLandroidx/datastore/preferences/protobuf/ListFieldSchema$ListFieldSchemaLite;->(Landroidx/datastore/preferences/protobuf/OneofInfo;)V PLandroidx/datastore/preferences/protobuf/ListFieldSchema;->()V PLandroidx/datastore/preferences/protobuf/ListFieldSchema;->(Landroidx/datastore/preferences/protobuf/OneofInfo;)V PLandroidx/datastore/preferences/protobuf/ManifestSchemaFactory$1;->()V PLandroidx/datastore/preferences/protobuf/ManifestSchemaFactory$CompositeMessageInfoFactory;->([Landroidx/datastore/preferences/protobuf/MessageInfoFactory;)V PLandroidx/datastore/preferences/protobuf/ManifestSchemaFactory$CompositeMessageInfoFactory;->messageInfoFor(Ljava/lang/Class;)Landroidx/datastore/preferences/protobuf/MessageInfo; PLandroidx/datastore/preferences/protobuf/ManifestSchemaFactory;->()V PLandroidx/datastore/preferences/protobuf/ManifestSchemaFactory;->()V PLandroidx/datastore/preferences/protobuf/ManifestSchemaFactory;->isProto2(Landroidx/datastore/preferences/protobuf/MessageInfo;)Z PLandroidx/datastore/preferences/protobuf/MapEntryLite;->(Landroidx/datastore/preferences/protobuf/WireFormat$FieldType;Ljava/lang/Object;Landroidx/datastore/preferences/protobuf/WireFormat$FieldType;Ljava/lang/Object;)V PLandroidx/datastore/preferences/protobuf/MapFieldLite;->()V PLandroidx/datastore/preferences/protobuf/MapFieldLite;->()V PLandroidx/datastore/preferences/protobuf/MapFieldLite;->ensureMutable()V PLandroidx/datastore/preferences/protobuf/MapFieldLite;->entrySet()Ljava/util/Set; PLandroidx/datastore/preferences/protobuf/MapFieldLite;->mutableCopy()Landroidx/datastore/preferences/protobuf/MapFieldLite; PLandroidx/datastore/preferences/protobuf/MapFieldLite;->put(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLandroidx/datastore/preferences/protobuf/MapFieldSchemaLite;->()V PLandroidx/datastore/preferences/protobuf/MapFieldSchemaLite;->mergeFrom(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLandroidx/datastore/preferences/protobuf/MapFieldSchemas;->()V PLandroidx/datastore/preferences/protobuf/MessageSchema;->()V PLandroidx/datastore/preferences/protobuf/MessageSchema;->([I[Ljava/lang/Object;IILandroidx/datastore/preferences/protobuf/AbstractMessageLite;ZZ[IIILandroidx/datastore/preferences/protobuf/NewInstanceSchemaLite;Landroidx/datastore/preferences/protobuf/ListFieldSchema;Landroidx/datastore/preferences/protobuf/UnknownFieldSchema;Landroidx/datastore/preferences/protobuf/ExtensionSchemaLite;Landroidx/datastore/preferences/protobuf/MapFieldSchemaLite;)V PLandroidx/datastore/preferences/protobuf/MessageSchema;->filterMapUnknownEnumValues(Ljava/lang/Object;ILjava/lang/Object;Landroidx/datastore/preferences/protobuf/UnknownFieldSchema;)Ljava/lang/Object; PLandroidx/datastore/preferences/protobuf/MessageSchema;->getMapFieldDefaultEntry(I)Ljava/lang/Object; PLandroidx/datastore/preferences/protobuf/MessageSchema;->makeImmutable(Ljava/lang/Object;)V PLandroidx/datastore/preferences/protobuf/MessageSchema;->mergeFrom(Ljava/lang/Object;Landroidx/datastore/preferences/protobuf/Reader;Landroidx/datastore/preferences/protobuf/ExtensionRegistryLite;)V PLandroidx/datastore/preferences/protobuf/MessageSchema;->mergeMap(Ljava/lang/Object;ILjava/lang/Object;Landroidx/datastore/preferences/protobuf/ExtensionRegistryLite;Landroidx/datastore/preferences/protobuf/Reader;)V PLandroidx/datastore/preferences/protobuf/MessageSchema;->newInstance()Ljava/lang/Object; PLandroidx/datastore/preferences/protobuf/MessageSchema;->newSchema(Landroidx/datastore/preferences/protobuf/MessageInfo;Landroidx/datastore/preferences/protobuf/NewInstanceSchemaLite;Landroidx/datastore/preferences/protobuf/ListFieldSchema;Landroidx/datastore/preferences/protobuf/UnknownFieldSchema;Landroidx/datastore/preferences/protobuf/ExtensionSchemaLite;Landroidx/datastore/preferences/protobuf/MapFieldSchemaLite;)Landroidx/datastore/preferences/protobuf/MessageSchema; PLandroidx/datastore/preferences/protobuf/MessageSchema;->newSchemaForRawMessageInfo(Landroidx/datastore/preferences/protobuf/RawMessageInfo;Landroidx/datastore/preferences/protobuf/NewInstanceSchemaLite;Landroidx/datastore/preferences/protobuf/ListFieldSchema;Landroidx/datastore/preferences/protobuf/UnknownFieldSchema;Landroidx/datastore/preferences/protobuf/ExtensionSchemaLite;Landroidx/datastore/preferences/protobuf/MapFieldSchemaLite;)Landroidx/datastore/preferences/protobuf/MessageSchema; PLandroidx/datastore/preferences/protobuf/MessageSchema;->offset(I)J PLandroidx/datastore/preferences/protobuf/MessageSchema;->positionForFieldNumber(I)I PLandroidx/datastore/preferences/protobuf/MessageSchema;->reflectField(Ljava/lang/Class;Ljava/lang/String;)Ljava/lang/reflect/Field; PLandroidx/datastore/preferences/protobuf/MessageSchema;->setOneofPresent(Ljava/lang/Object;II)V PLandroidx/datastore/preferences/protobuf/MessageSchema;->type(I)I PLandroidx/datastore/preferences/protobuf/MessageSchema;->typeAndOffsetAt(I)I PLandroidx/datastore/preferences/protobuf/NewInstanceSchemaLite;->()V PLandroidx/datastore/preferences/protobuf/NewInstanceSchemas;->()V PLandroidx/datastore/preferences/protobuf/OneofInfo;->()V PLandroidx/datastore/preferences/protobuf/OneofInfo;->()V PLandroidx/datastore/preferences/protobuf/OneofInfo;->access$400(B)Z PLandroidx/datastore/preferences/protobuf/Protobuf;->()V PLandroidx/datastore/preferences/protobuf/Protobuf;->()V PLandroidx/datastore/preferences/protobuf/Protobuf;->schemaFor(Ljava/lang/Class;)Landroidx/datastore/preferences/protobuf/Schema; PLandroidx/datastore/preferences/protobuf/Protobuf;->schemaFor(Ljava/lang/Object;)Landroidx/datastore/preferences/protobuf/Schema; PLandroidx/datastore/preferences/protobuf/RawMessageInfo;->(Landroidx/datastore/preferences/protobuf/AbstractMessageLite;Ljava/lang/String;[Ljava/lang/Object;)V PLandroidx/datastore/preferences/protobuf/SchemaUtil;->()V PLandroidx/datastore/preferences/protobuf/SchemaUtil;->getUnknownFieldSetSchema(Z)Landroidx/datastore/preferences/protobuf/UnknownFieldSchema; PLandroidx/datastore/preferences/protobuf/SmallSortedMap$EmptySet$1;->()V PLandroidx/datastore/preferences/protobuf/SmallSortedMap$EmptySet$2;->()V PLandroidx/datastore/preferences/protobuf/UnknownFieldSchema;->()V PLandroidx/datastore/preferences/protobuf/UnknownFieldSetLite;->()V PLandroidx/datastore/preferences/protobuf/UnknownFieldSetLite;->(I[I[Ljava/lang/Object;Z)V PLandroidx/datastore/preferences/protobuf/UnknownFieldSetLiteSchema;->()V PLandroidx/datastore/preferences/protobuf/UnsafeUtil$1;->()V PLandroidx/datastore/preferences/protobuf/UnsafeUtil$1;->run()Ljava/lang/Object; PLandroidx/datastore/preferences/protobuf/UnsafeUtil$1;->run()Lsun/misc/Unsafe; PLandroidx/datastore/preferences/protobuf/UnsafeUtil$JvmMemoryAccessor;->(Lsun/misc/Unsafe;I)V PLandroidx/datastore/preferences/protobuf/UnsafeUtil;->()V PLandroidx/datastore/preferences/protobuf/UnsafeUtil;->arrayBaseOffset(Ljava/lang/Class;)I PLandroidx/datastore/preferences/protobuf/UnsafeUtil;->arrayIndexScale(Ljava/lang/Class;)I PLandroidx/datastore/preferences/protobuf/UnsafeUtil;->bufferAddressField()Ljava/lang/reflect/Field; PLandroidx/datastore/preferences/protobuf/UnsafeUtil;->determineAndroidSupportByAddressSize(Ljava/lang/Class;)Z PLandroidx/datastore/preferences/protobuf/UnsafeUtil;->getObject(Ljava/lang/Object;J)Ljava/lang/Object; PLandroidx/datastore/preferences/protobuf/UnsafeUtil;->getUnsafe()Lsun/misc/Unsafe; PLandroidx/datastore/preferences/protobuf/UnsafeUtil;->putObject(Ljava/lang/Object;JLjava/lang/Object;)V PLandroidx/datastore/preferences/protobuf/Utf8$SafeProcessor;->(I)V PLandroidx/datastore/preferences/protobuf/Utf8$SafeProcessor;->decodeUtf8([BII)Ljava/lang/String; PLandroidx/datastore/preferences/protobuf/Utf8;->()V PLandroidx/datastore/preferences/protobuf/WireFormat$FieldType$1;->(Ljava/lang/String;ILandroidx/datastore/preferences/protobuf/WireFormat$JavaType;I)V PLandroidx/datastore/preferences/protobuf/WireFormat$FieldType$2;->(Ljava/lang/String;ILandroidx/datastore/preferences/protobuf/WireFormat$JavaType;I)V PLandroidx/datastore/preferences/protobuf/WireFormat$FieldType$3;->(Ljava/lang/String;ILandroidx/datastore/preferences/protobuf/WireFormat$JavaType;I)V PLandroidx/datastore/preferences/protobuf/WireFormat$FieldType$4;->(Ljava/lang/String;ILandroidx/datastore/preferences/protobuf/WireFormat$JavaType;I)V PLandroidx/datastore/preferences/protobuf/WireFormat$FieldType;->()V PLandroidx/datastore/preferences/protobuf/WireFormat$FieldType;->(Ljava/lang/String;ILandroidx/datastore/preferences/protobuf/WireFormat$JavaType;I)V PLandroidx/datastore/preferences/protobuf/WireFormat$FieldType;->(Ljava/lang/String;ILandroidx/datastore/preferences/protobuf/WireFormat$JavaType;ILandroidx/datastore/preferences/protobuf/OneofInfo;)V PLandroidx/datastore/preferences/protobuf/WireFormat$JavaType;->()V PLandroidx/datastore/preferences/protobuf/WireFormat$JavaType;->(Ljava/lang/String;ILjava/lang/Object;)V PLandroidx/fragment/app/BackStackRecord;->(Landroidx/fragment/app/FragmentManager;)V PLandroidx/fragment/app/BackStackRecord;->bumpBackStackNesting(I)V PLandroidx/fragment/app/BackStackRecord;->commit()I PLandroidx/fragment/app/BackStackRecord;->commitAllowingStateLoss()I PLandroidx/fragment/app/BackStackRecord;->commitInternal(Z)I PLandroidx/fragment/app/BackStackRecord;->doAddOp(ILandroidx/fragment/app/Fragment;Ljava/lang/String;I)V PLandroidx/fragment/app/BackStackRecord;->generateOps(Ljava/util/ArrayList;Ljava/util/ArrayList;)Z PLandroidx/fragment/app/BackStackRecord;->setPrimaryNavigationFragment(Landroidx/fragment/app/Fragment;)Landroidx/fragment/app/FragmentTransaction; PLandroidx/fragment/app/DefaultSpecialEffectsController;->(Landroid/view/ViewGroup;)V PLandroidx/fragment/app/DialogFragment$1;->(Ljava/lang/Object;I)V PLandroidx/fragment/app/Fragment$1;->(Landroidx/fragment/app/Fragment;I)V PLandroidx/fragment/app/Fragment$4;->(Landroidx/fragment/app/Fragment;)V PLandroidx/fragment/app/Fragment$4;->onFindViewById(I)Landroid/view/View; PLandroidx/fragment/app/Fragment$4;->onHasView()Z PLandroidx/fragment/app/Fragment$5;->(Landroidx/fragment/app/Fragment;)V PLandroidx/fragment/app/Fragment$5;->onStateChanged(Landroidx/lifecycle/LifecycleOwner;Landroidx/lifecycle/Lifecycle$Event;)V PLandroidx/fragment/app/Fragment$6;->()V PLandroidx/fragment/app/Fragment$6;->(Ljava/lang/Object;)V PLandroidx/fragment/app/Fragment$7;->(Landroidx/fragment/app/FragmentManager;)V PLandroidx/fragment/app/Fragment$7;->dispatchOnFragmentActivityCreated(Landroidx/fragment/app/Fragment;Landroid/os/Bundle;Z)V PLandroidx/fragment/app/Fragment$7;->dispatchOnFragmentAttached(Landroidx/fragment/app/Fragment;Z)V PLandroidx/fragment/app/Fragment$7;->dispatchOnFragmentCreated(Landroidx/fragment/app/Fragment;Landroid/os/Bundle;Z)V PLandroidx/fragment/app/Fragment$7;->dispatchOnFragmentDestroyed(Landroidx/fragment/app/Fragment;Z)V PLandroidx/fragment/app/Fragment$7;->dispatchOnFragmentDetached(Landroidx/fragment/app/Fragment;Z)V PLandroidx/fragment/app/Fragment$7;->dispatchOnFragmentPaused(Landroidx/fragment/app/Fragment;Z)V PLandroidx/fragment/app/Fragment$7;->dispatchOnFragmentPreAttached(Landroidx/fragment/app/Fragment;Z)V PLandroidx/fragment/app/Fragment$7;->dispatchOnFragmentPreCreated(Landroidx/fragment/app/Fragment;Landroid/os/Bundle;Z)V PLandroidx/fragment/app/Fragment$7;->dispatchOnFragmentResumed(Landroidx/fragment/app/Fragment;Z)V PLandroidx/fragment/app/Fragment$7;->dispatchOnFragmentSaveInstanceState(Landroidx/fragment/app/Fragment;Landroid/os/Bundle;Z)V PLandroidx/fragment/app/Fragment$7;->dispatchOnFragmentStarted(Landroidx/fragment/app/Fragment;Z)V PLandroidx/fragment/app/Fragment$7;->dispatchOnFragmentStopped(Landroidx/fragment/app/Fragment;Z)V PLandroidx/fragment/app/Fragment$7;->dispatchOnFragmentViewCreated(Landroidx/fragment/app/Fragment;Landroid/view/View;Landroid/os/Bundle;Z)V PLandroidx/fragment/app/Fragment$7;->dispatchOnFragmentViewDestroyed(Landroidx/fragment/app/Fragment;Z)V PLandroidx/fragment/app/Fragment$AnimationInfo;->()V PLandroidx/fragment/app/Fragment;->()V PLandroidx/fragment/app/Fragment;->createFragmentContainer()Landroidx/fragment/app/FragmentContainer; PLandroidx/fragment/app/Fragment;->ensureAnimationInfo()Landroidx/fragment/app/Fragment$AnimationInfo; PLandroidx/fragment/app/Fragment;->equals(Ljava/lang/Object;)Z PLandroidx/fragment/app/Fragment;->getActivity()Landroidx/fragment/app/FragmentActivity; PLandroidx/fragment/app/Fragment;->getArguments()Landroid/os/Bundle; PLandroidx/fragment/app/Fragment;->getChildFragmentManager()Landroidx/fragment/app/FragmentManager; PLandroidx/fragment/app/Fragment;->getContext()Landroid/content/Context; PLandroidx/fragment/app/Fragment;->getDefaultViewModelProviderFactory()Landroidx/lifecycle/ViewModelProvider$Factory; PLandroidx/fragment/app/Fragment;->getFocusedView()Landroid/view/View; PLandroidx/fragment/app/Fragment;->getHost()Ljava/lang/Object; PLandroidx/fragment/app/Fragment;->getId()I PLandroidx/fragment/app/Fragment;->getLayoutInflater(Landroid/os/Bundle;)Landroid/view/LayoutInflater; PLandroidx/fragment/app/Fragment;->getLifecycle()Landroidx/lifecycle/Lifecycle; PLandroidx/fragment/app/Fragment;->getMinimumMaxLifecycleState()I PLandroidx/fragment/app/Fragment;->getPostOnViewCreatedAlpha()F PLandroidx/fragment/app/Fragment;->getSavedStateRegistry()Landroidx/savedstate/SavedStateRegistry; PLandroidx/fragment/app/Fragment;->getTag()Ljava/lang/String; PLandroidx/fragment/app/Fragment;->getView()Landroid/view/View; PLandroidx/fragment/app/Fragment;->getViewLifecycleOwner()Landroidx/lifecycle/LifecycleOwner; PLandroidx/fragment/app/Fragment;->hashCode()I PLandroidx/fragment/app/Fragment;->instantiate(Landroid/content/Context;Ljava/lang/String;Landroid/os/Bundle;)Landroidx/fragment/app/Fragment; PLandroidx/fragment/app/Fragment;->noteStateNotSaved()V PLandroidx/fragment/app/Fragment;->onActivityCreated(Landroid/os/Bundle;)V PLandroidx/fragment/app/Fragment;->onAttach(Landroid/app/Activity;)V PLandroidx/fragment/app/Fragment;->onAttach(Landroid/content/Context;)V PLandroidx/fragment/app/Fragment;->onAttachFragment(Landroidx/fragment/app/Fragment;)V PLandroidx/fragment/app/Fragment;->onCreate(Landroid/os/Bundle;)V PLandroidx/fragment/app/Fragment;->onCreateView(Landroid/view/LayoutInflater;Landroid/view/ViewGroup;Landroid/os/Bundle;)Landroid/view/View; PLandroidx/fragment/app/Fragment;->onDestroy()V PLandroidx/fragment/app/Fragment;->onDestroyView()V PLandroidx/fragment/app/Fragment;->onDetach()V PLandroidx/fragment/app/Fragment;->onGetLayoutInflater(Landroid/os/Bundle;)Landroid/view/LayoutInflater; PLandroidx/fragment/app/Fragment;->onInflate(Landroid/content/Context;Landroid/util/AttributeSet;Landroid/os/Bundle;)V PLandroidx/fragment/app/Fragment;->onPause()V PLandroidx/fragment/app/Fragment;->onPrimaryNavigationFragmentChanged(Z)V PLandroidx/fragment/app/Fragment;->onResume()V PLandroidx/fragment/app/Fragment;->onSaveInstanceState(Landroid/os/Bundle;)V PLandroidx/fragment/app/Fragment;->onStart()V PLandroidx/fragment/app/Fragment;->onStop()V PLandroidx/fragment/app/Fragment;->onViewCreated(Landroid/view/View;Landroid/os/Bundle;)V PLandroidx/fragment/app/Fragment;->onViewStateRestored(Landroid/os/Bundle;)V PLandroidx/fragment/app/Fragment;->performActivityCreated(Landroid/os/Bundle;)V PLandroidx/fragment/app/Fragment;->performCreate(Landroid/os/Bundle;)V PLandroidx/fragment/app/Fragment;->performDestroy()V PLandroidx/fragment/app/Fragment;->performDestroyView()V PLandroidx/fragment/app/Fragment;->performDetach()V PLandroidx/fragment/app/Fragment;->performGetLayoutInflater(Landroid/os/Bundle;)Landroid/view/LayoutInflater; PLandroidx/fragment/app/Fragment;->performPause()V PLandroidx/fragment/app/Fragment;->performPrimaryNavigationFragmentChanged()V PLandroidx/fragment/app/Fragment;->performResume()V PLandroidx/fragment/app/Fragment;->performSaveInstanceState(Landroid/os/Bundle;)V PLandroidx/fragment/app/Fragment;->performStop()V PLandroidx/fragment/app/Fragment;->performViewCreated()V PLandroidx/fragment/app/Fragment;->requireActivity()Landroidx/fragment/app/FragmentActivity; PLandroidx/fragment/app/Fragment;->requireContext()Landroid/content/Context; PLandroidx/fragment/app/Fragment;->requireView()Landroid/view/View; PLandroidx/fragment/app/Fragment;->restoreChildFragmentState(Landroid/os/Bundle;)V PLandroidx/fragment/app/Fragment;->restoreViewState(Landroid/os/Bundle;)V PLandroidx/fragment/app/Fragment;->setAnimations(IIII)V PLandroidx/fragment/app/Fragment;->setArguments(Landroid/os/Bundle;)V PLandroidx/fragment/app/Fragment;->setFocusedView(Landroid/view/View;)V PLandroidx/fragment/app/Fragment;->setNextTransition(I)V PLandroidx/fragment/app/Fragment;->setPopDirection(Z)V PLandroidx/fragment/app/Fragment;->setPostOnViewCreatedAlpha(F)V PLandroidx/fragment/app/Fragment;->setSharedElementNames(Ljava/util/ArrayList;Ljava/util/ArrayList;)V PLandroidx/fragment/app/FragmentActivity$HostCallbacks;->(Landroidx/fragment/app/FragmentActivity;)V PLandroidx/fragment/app/FragmentActivity$HostCallbacks;->getActivityResultRegistry()Landroidx/activity/result/ActivityResultRegistry; PLandroidx/fragment/app/FragmentActivity$HostCallbacks;->getLifecycle()Landroidx/lifecycle/Lifecycle; PLandroidx/fragment/app/FragmentActivity$HostCallbacks;->getOnBackPressedDispatcher()Landroidx/activity/OnBackPressedDispatcher; PLandroidx/fragment/app/FragmentActivity$HostCallbacks;->getSavedStateRegistry()Landroidx/savedstate/SavedStateRegistry; PLandroidx/fragment/app/FragmentActivity$HostCallbacks;->getViewModelStore()Landroidx/lifecycle/ViewModelStore; PLandroidx/fragment/app/FragmentActivity$HostCallbacks;->onAttachFragment(Landroidx/fragment/app/FragmentManager;Landroidx/fragment/app/Fragment;)V PLandroidx/fragment/app/FragmentActivity;->()V PLandroidx/fragment/app/FragmentActivity;->getSupportFragmentManager()Landroidx/fragment/app/FragmentManager; PLandroidx/fragment/app/FragmentActivity;->markFragmentsCreated()V PLandroidx/fragment/app/FragmentActivity;->markState(Landroidx/fragment/app/FragmentManager;Landroidx/lifecycle/Lifecycle$State;)Z PLandroidx/fragment/app/FragmentActivity;->onAttachFragment(Landroidx/fragment/app/Fragment;)V PLandroidx/fragment/app/FragmentActivity;->onCreate(Landroid/os/Bundle;)V PLandroidx/fragment/app/FragmentActivity;->onDestroy()V PLandroidx/fragment/app/FragmentActivity;->onPause()V PLandroidx/fragment/app/FragmentActivity;->onPostResume()V PLandroidx/fragment/app/FragmentActivity;->onResume()V PLandroidx/fragment/app/FragmentActivity;->onResumeFragments()V PLandroidx/fragment/app/FragmentActivity;->onStart()V PLandroidx/fragment/app/FragmentActivity;->onStateNotSaved()V PLandroidx/fragment/app/FragmentActivity;->onStop()V PLandroidx/fragment/app/FragmentContainer;->()V PLandroidx/fragment/app/FragmentContainerView;->(Landroid/content/Context;)V PLandroidx/fragment/app/FragmentContainerView;->addView(Landroid/view/View;ILandroid/view/ViewGroup$LayoutParams;)V PLandroidx/fragment/app/FragmentContainerView;->dispatchApplyWindowInsets(Landroid/view/WindowInsets;)Landroid/view/WindowInsets; PLandroidx/fragment/app/FragmentContainerView;->onApplyWindowInsets(Landroid/view/WindowInsets;)Landroid/view/WindowInsets; PLandroidx/fragment/app/FragmentContainerView;->removeView(Landroid/view/View;)V PLandroidx/fragment/app/FragmentContainerView;->setDrawDisappearingViewsLast(Z)V PLandroidx/fragment/app/FragmentContainerView;->setOnApplyWindowInsetsListener(Landroid/view/View$OnApplyWindowInsetsListener;)V PLandroidx/fragment/app/FragmentController;->(Landroidx/fragment/app/FragmentHostCallback;)V PLandroidx/fragment/app/FragmentController;->noteStateNotSaved()V PLandroidx/fragment/app/FragmentFactory;->()V PLandroidx/fragment/app/FragmentFactory;->()V PLandroidx/fragment/app/FragmentFactory;->loadClass(Ljava/lang/ClassLoader;Ljava/lang/String;)Ljava/lang/Class; PLandroidx/fragment/app/FragmentFactory;->loadFragmentClass(Ljava/lang/ClassLoader;Ljava/lang/String;)Ljava/lang/Class; PLandroidx/fragment/app/FragmentHostCallback;->(Landroidx/fragment/app/FragmentActivity;)V PLandroidx/fragment/app/FragmentLayoutInflaterFactory;->(Landroidx/fragment/app/FragmentManager;)V PLandroidx/fragment/app/FragmentManager$1;->(Landroidx/fragment/app/FragmentManager;Z)V PLandroidx/fragment/app/FragmentManager$1;->(Ljava/lang/Object;I)V PLandroidx/fragment/app/FragmentManager$2;->(Landroidx/fragment/app/FragmentManager;)V PLandroidx/fragment/app/FragmentManager$2;->instantiate(Ljava/lang/ClassLoader;Ljava/lang/String;)Landroidx/fragment/app/Fragment; PLandroidx/fragment/app/FragmentManager$3;->(Landroidx/fragment/app/FragmentManager;I)V PLandroidx/fragment/app/FragmentManager$6;->(Landroidx/fragment/app/FragmentManager;Landroidx/fragment/app/Fragment;)V PLandroidx/fragment/app/FragmentManager$6;->onAttachFragment(Landroidx/fragment/app/FragmentManager;Landroidx/fragment/app/Fragment;)V PLandroidx/fragment/app/FragmentManager$FragmentIntentSenderContract;->(I)V PLandroidx/fragment/app/FragmentManager;->addFragment(Landroidx/fragment/app/Fragment;)Landroidx/fragment/app/FragmentStateManager; PLandroidx/fragment/app/FragmentManager;->cleanupExec()V PLandroidx/fragment/app/FragmentManager;->createOrGetFragmentStateManager(Landroidx/fragment/app/Fragment;)Landroidx/fragment/app/FragmentStateManager; PLandroidx/fragment/app/FragmentManager;->dispatchCreate()V PLandroidx/fragment/app/FragmentManager;->dispatchParentPrimaryNavigationFragmentChanged(Landroidx/fragment/app/Fragment;)V PLandroidx/fragment/app/FragmentManager;->doPendingDeferredStart()V PLandroidx/fragment/app/FragmentManager;->endAnimatingAwayFragments()V PLandroidx/fragment/app/FragmentManager;->enqueueAction(Landroidx/fragment/app/FragmentManager$OpGenerator;Z)V PLandroidx/fragment/app/FragmentManager;->execSingleAction(Landroidx/fragment/app/FragmentManager$OpGenerator;Z)V PLandroidx/fragment/app/FragmentManager;->findActiveFragment(Ljava/lang/String;)Landroidx/fragment/app/Fragment; PLandroidx/fragment/app/FragmentManager;->findFragmentById(I)Landroidx/fragment/app/Fragment; PLandroidx/fragment/app/FragmentManager;->findFragmentByTag(Ljava/lang/String;)Landroidx/fragment/app/Fragment; PLandroidx/fragment/app/FragmentManager;->getBackStackEntryCount()I PLandroidx/fragment/app/FragmentManager;->getFragmentContainer(Landroidx/fragment/app/Fragment;)Landroid/view/ViewGroup; PLandroidx/fragment/app/FragmentManager;->getFragmentFactory()Landroidx/fragment/app/FragmentFactory; PLandroidx/fragment/app/FragmentManager;->getFragments()Ljava/util/List; PLandroidx/fragment/app/FragmentManager;->isMenuAvailable(Landroidx/fragment/app/Fragment;)Z PLandroidx/fragment/app/FragmentManager;->isPrimaryNavigation(Landroidx/fragment/app/Fragment;)Z PLandroidx/fragment/app/FragmentManager;->isStateSaved()Z PLandroidx/fragment/app/FragmentManager;->performPendingDeferredStart(Landroidx/fragment/app/FragmentStateManager;)V PLandroidx/fragment/app/FragmentManager;->removeRedundantOperationsAndExecute(Ljava/util/ArrayList;Ljava/util/ArrayList;)V PLandroidx/fragment/app/FragmentManager;->scheduleCommit()V PLandroidx/fragment/app/FragmentManager;->setExitAnimationOrder(Landroidx/fragment/app/Fragment;Z)V PLandroidx/fragment/app/FragmentManager;->setPrimaryNavigationFragment(Landroidx/fragment/app/Fragment;)V PLandroidx/fragment/app/FragmentManagerImpl;->()V PLandroidx/fragment/app/FragmentManagerState;->()V PLandroidx/fragment/app/FragmentManagerState;->()V PLandroidx/fragment/app/FragmentManagerState;->writeToParcel(Landroid/os/Parcel;I)V PLandroidx/fragment/app/FragmentManagerViewModel$1;->(I)V PLandroidx/fragment/app/FragmentManagerViewModel$1;->create(Ljava/lang/Class;)Landroidx/lifecycle/ViewModel; PLandroidx/fragment/app/FragmentManagerViewModel;->()V PLandroidx/fragment/app/FragmentManagerViewModel;->(Z)V PLandroidx/fragment/app/FragmentManagerViewModel;->clearNonConfigState(Landroidx/fragment/app/Fragment;)V PLandroidx/fragment/app/FragmentManagerViewModel;->clearNonConfigStateInternal(Ljava/lang/String;)V PLandroidx/fragment/app/FragmentManagerViewModel;->onCleared()V PLandroidx/fragment/app/FragmentManagerViewModel;->shouldDestroy(Landroidx/fragment/app/Fragment;)Z PLandroidx/fragment/app/FragmentState$1;->(I)V PLandroidx/fragment/app/FragmentState;->()V PLandroidx/fragment/app/FragmentState;->(Landroidx/fragment/app/Fragment;)V PLandroidx/fragment/app/FragmentState;->writeToParcel(Landroid/os/Parcel;I)V PLandroidx/fragment/app/FragmentStateManager$1;->(Landroidx/fragment/app/FragmentStateManager;Landroid/view/View;)V PLandroidx/fragment/app/FragmentStateManager$1;->onViewAttachedToWindow(Landroid/view/View;)V PLandroidx/fragment/app/FragmentStateManager;->(Landroidx/fragment/app/Fragment$7;Lcom/google/firebase/iid/zzaw;Landroidx/fragment/app/Fragment;)V PLandroidx/fragment/app/FragmentStateManager;->activityCreated()V PLandroidx/fragment/app/FragmentStateManager;->addViewToContainer()V PLandroidx/fragment/app/FragmentStateManager;->create()V PLandroidx/fragment/app/FragmentStateManager;->destroyFragmentView()V PLandroidx/fragment/app/FragmentStateManager;->detach()V PLandroidx/fragment/app/FragmentStateManager;->ensureInflatedView()V PLandroidx/fragment/app/FragmentStateManager;->pause()V PLandroidx/fragment/app/FragmentStateManager;->restoreState(Ljava/lang/ClassLoader;)V PLandroidx/fragment/app/FragmentStateManager;->resume()V PLandroidx/fragment/app/FragmentStateManager;->saveBasicState()Landroid/os/Bundle; PLandroidx/fragment/app/FragmentStateManager;->saveState()V PLandroidx/fragment/app/FragmentStateManager;->saveViewState()V PLandroidx/fragment/app/FragmentStateManager;->start()V PLandroidx/fragment/app/FragmentStateManager;->stop()V PLandroidx/fragment/app/FragmentTransaction$Op;->(ILandroidx/fragment/app/Fragment;)V PLandroidx/fragment/app/FragmentTransaction$Op;->(ILandroidx/fragment/app/Fragment;Z)V PLandroidx/fragment/app/FragmentTransaction;->(Landroidx/fragment/app/FragmentFactory;Ljava/lang/ClassLoader;)V PLandroidx/fragment/app/FragmentTransaction;->addOp(Landroidx/fragment/app/FragmentTransaction$Op;)V PLandroidx/fragment/app/FragmentTransaction;->disallowAddToBackStack()Landroidx/fragment/app/FragmentTransaction; PLandroidx/fragment/app/FragmentTransaction;->replace(ILandroidx/fragment/app/Fragment;Ljava/lang/String;)Landroidx/fragment/app/FragmentTransaction; PLandroidx/fragment/app/FragmentTransitionImpl$1;->(Ljava/lang/Object;ILjava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;I)V PLandroidx/fragment/app/FragmentTransitionImpl$1;->run()V PLandroidx/fragment/app/FragmentViewLifecycleOwner;->(Landroidx/fragment/app/Fragment;Landroidx/lifecycle/ViewModelStore;)V PLandroidx/fragment/app/FragmentViewLifecycleOwner;->getSavedStateRegistry()Landroidx/savedstate/SavedStateRegistry; PLandroidx/fragment/app/FragmentViewLifecycleOwner;->handleLifecycleEvent(Landroidx/lifecycle/Lifecycle$Event;)V PLandroidx/fragment/app/FragmentViewModelLazyKt$createViewModelLazy$factoryPromise$1;->(Landroidx/fragment/app/Fragment;I)V PLandroidx/fragment/app/FragmentViewModelLazyKt$createViewModelLazy$factoryPromise$1;->invoke()Landroidx/lifecycle/ViewModelProvider$Factory; PLandroidx/fragment/app/FragmentViewModelLazyKt$createViewModelLazy$factoryPromise$1;->invoke()Landroidx/lifecycle/ViewModelStore; PLandroidx/fragment/app/FragmentViewModelLazyKt$createViewModelLazy$factoryPromise$1;->invoke()Ljava/lang/Object; PLandroidx/fragment/app/SpecialEffectsController$1;->(Landroidx/fragment/app/SpecialEffectsController;Landroidx/fragment/app/SpecialEffectsController$FragmentStateManagerOperation;I)V PLandroidx/fragment/app/SpecialEffectsController$FragmentStateManagerOperation;->cancel()V PLandroidx/fragment/app/SpecialEffectsController$FragmentStateManagerOperation;->complete()V PLandroidx/fragment/app/SpecialEffectsController$FragmentStateManagerOperation;->mergeWith$enumunboxing$(II)V PLandroidx/fragment/app/SpecialEffectsController$FragmentStateManagerOperation;->onStart()V PLandroidx/fragment/app/SpecialEffectsController;->(Landroid/view/ViewGroup;)V PLandroidx/fragment/app/SpecialEffectsController;->enqueue$enumunboxing$(IILandroidx/fragment/app/FragmentStateManager;)V PLandroidx/fragment/app/SpecialEffectsController;->executePendingOperations()V PLandroidx/fragment/app/SpecialEffectsController;->getOrCreateController(Landroid/view/ViewGroup;Landroidx/fragment/app/FragmentManager;)Landroidx/fragment/app/SpecialEffectsController; PLandroidx/fragment/app/SpecialEffectsController;->markPostponedState()V PLandroidx/interpolator/view/animation/FastOutLinearInInterpolator;->()V PLandroidx/interpolator/view/animation/FastOutLinearInInterpolator;->()V PLandroidx/interpolator/view/animation/FastOutSlowInInterpolator;->()V PLandroidx/interpolator/view/animation/FastOutSlowInInterpolator;->()V PLandroidx/interpolator/view/animation/LinearOutSlowInInterpolator;->()V PLandroidx/interpolator/view/animation/LinearOutSlowInInterpolator;->()V PLandroidx/interpolator/view/animation/LookupTableInterpolator;->([F)V PLandroidx/lifecycle/AbstractSavedStateViewModelFactory;->(Landroidx/savedstate/SavedStateRegistryOwner;Landroid/os/Bundle;)V PLandroidx/lifecycle/AbstractSavedStateViewModelFactory;->create(Ljava/lang/Class;)Landroidx/lifecycle/ViewModel; PLandroidx/lifecycle/AbstractSavedStateViewModelFactory;->create(Ljava/lang/String;Ljava/lang/Class;)Landroidx/lifecycle/ViewModel; PLandroidx/lifecycle/ClassesInfoCache$CallbackInfo;->(Ljava/util/Map;)V PLandroidx/lifecycle/ClassesInfoCache$MethodReference;->(ILjava/lang/reflect/Method;)V PLandroidx/lifecycle/ClassesInfoCache$MethodReference;->hashCode()I PLandroidx/lifecycle/ClassesInfoCache;->()V PLandroidx/lifecycle/ClassesInfoCache;->()V PLandroidx/lifecycle/ClassesInfoCache;->createInfo(Ljava/lang/Class;[Ljava/lang/reflect/Method;)Landroidx/lifecycle/ClassesInfoCache$CallbackInfo; PLandroidx/lifecycle/ClassesInfoCache;->getInfo(Ljava/lang/Class;)Landroidx/lifecycle/ClassesInfoCache$CallbackInfo; PLandroidx/lifecycle/ClassesInfoCache;->verifyAndPutHandler(Ljava/util/Map;Landroidx/lifecycle/ClassesInfoCache$MethodReference;Landroidx/lifecycle/Lifecycle$Event;Ljava/lang/Class;)V PLandroidx/lifecycle/CloseableCoroutineScope;->(Lkotlin/coroutines/CoroutineContext;)V PLandroidx/lifecycle/CloseableCoroutineScope;->close()V PLandroidx/lifecycle/CloseableCoroutineScope;->getCoroutineContext()Lkotlin/coroutines/CoroutineContext; PLandroidx/lifecycle/CoroutineLiveData$1;->(Ljava/lang/Object;I)V PLandroidx/lifecycle/CoroutineLiveData$1;->invoke()Ljava/lang/Object; PLandroidx/lifecycle/EmptyActivityLifecycleCallbacks;->()V PLandroidx/lifecycle/EmptyActivityLifecycleCallbacks;->onActivityCreated(Landroid/app/Activity;Landroid/os/Bundle;)V PLandroidx/lifecycle/EmptyActivityLifecycleCallbacks;->onActivityDestroyed(Landroid/app/Activity;)V PLandroidx/lifecycle/EmptyActivityLifecycleCallbacks;->onActivityPaused(Landroid/app/Activity;)V PLandroidx/lifecycle/EmptyActivityLifecycleCallbacks;->onActivityResumed(Landroid/app/Activity;)V PLandroidx/lifecycle/EmptyActivityLifecycleCallbacks;->onActivitySaveInstanceState(Landroid/app/Activity;Landroid/os/Bundle;)V PLandroidx/lifecycle/EmptyActivityLifecycleCallbacks;->onActivityStarted(Landroid/app/Activity;)V PLandroidx/lifecycle/EmptyActivityLifecycleCallbacks;->onActivityStopped(Landroid/app/Activity;)V PLandroidx/lifecycle/Lifecycle$1;->()V PLandroidx/lifecycle/Lifecycle$Event;->()V PLandroidx/lifecycle/Lifecycle$Event;->(Ljava/lang/String;I)V PLandroidx/lifecycle/Lifecycle$Event;->upTo(Landroidx/lifecycle/Lifecycle$State;)Landroidx/lifecycle/Lifecycle$Event; PLandroidx/lifecycle/Lifecycle$Event;->values()[Landroidx/lifecycle/Lifecycle$Event; PLandroidx/lifecycle/Lifecycle$State;->()V PLandroidx/lifecycle/Lifecycle$State;->(Ljava/lang/String;I)V PLandroidx/lifecycle/Lifecycle$State;->values()[Landroidx/lifecycle/Lifecycle$State; PLandroidx/lifecycle/Lifecycle;->()V PLandroidx/lifecycle/LifecycleController$observer$1;->(Landroidx/lifecycle/LifecycleController;Lkotlinx/coroutines/Job;)V PLandroidx/lifecycle/LifecycleCoroutineScopeImpl$register$1;->(Landroidx/lifecycle/LifecycleCoroutineScopeImpl;Lkotlin/coroutines/Continuation;)V PLandroidx/lifecycle/LifecycleCoroutineScopeImpl$register$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; PLandroidx/lifecycle/LifecycleCoroutineScopeImpl$register$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLandroidx/lifecycle/LifecycleCoroutineScopeImpl;->(Landroidx/lifecycle/Lifecycle;Lkotlin/coroutines/CoroutineContext;)V PLandroidx/lifecycle/LifecycleCoroutineScopeImpl;->getCoroutineContext()Lkotlin/coroutines/CoroutineContext; PLandroidx/lifecycle/LifecycleDispatcher$DispatcherActivityCallback;->()V PLandroidx/lifecycle/LifecycleDispatcher$DispatcherActivityCallback;->onActivityCreated(Landroid/app/Activity;Landroid/os/Bundle;)V PLandroidx/lifecycle/LifecycleDispatcher$DispatcherActivityCallback;->onActivitySaveInstanceState(Landroid/app/Activity;Landroid/os/Bundle;)V PLandroidx/lifecycle/LifecycleDispatcher$DispatcherActivityCallback;->onActivityStopped(Landroid/app/Activity;)V PLandroidx/lifecycle/LifecycleDispatcher;->()V PLandroidx/lifecycle/LifecycleRegistry;->setCurrentState(Landroidx/lifecycle/Lifecycle$State;)V PLandroidx/lifecycle/Lifecycling;->()V PLandroidx/lifecycle/Lifecycling;->getAdapterName(Ljava/lang/String;)Ljava/lang/String; PLandroidx/lifecycle/Lifecycling;->getObserverConstructorType(Ljava/lang/Class;)I PLandroidx/lifecycle/LiveData$1;->(Ljava/lang/Object;I)V PLandroidx/lifecycle/LiveData$1;->run()V PLandroidx/lifecycle/LiveData;->()V PLandroidx/lifecycle/LiveData;->()V PLandroidx/lifecycle/LiveData;->assertMainThread(Ljava/lang/String;)V PLandroidx/lifecycle/LiveData;->dispatchingValue(Landroidx/lifecycle/LiveData$ObserverWrapper;)V PLandroidx/lifecycle/MethodCallsLogger;->(Landroidx/lifecycle/ProcessLifecycleOwner;)V PLandroidx/lifecycle/MutableLiveData;->()V PLandroidx/lifecycle/MutableLiveData;->setValue(Ljava/lang/Object;)V PLandroidx/lifecycle/ProcessLifecycleOwner$3$1;->(Landroidx/lifecycle/ProcessLifecycleOwner$3;)V PLandroidx/lifecycle/ProcessLifecycleOwner$3$1;->onActivityPostResumed(Landroid/app/Activity;)V PLandroidx/lifecycle/ProcessLifecycleOwner$3$1;->onActivityPostStarted(Landroid/app/Activity;)V PLandroidx/lifecycle/ProcessLifecycleOwner$3;->(Landroidx/lifecycle/ProcessLifecycleOwner;)V PLandroidx/lifecycle/ProcessLifecycleOwner$3;->onActivityCreated(Landroid/app/Activity;Landroid/os/Bundle;)V PLandroidx/lifecycle/ProcessLifecycleOwner$3;->onActivityPaused(Landroid/app/Activity;)V PLandroidx/lifecycle/ProcessLifecycleOwner$3;->onActivityPreCreated(Landroid/app/Activity;Landroid/os/Bundle;)V PLandroidx/lifecycle/ProcessLifecycleOwner$3;->onActivityStopped(Landroid/app/Activity;)V PLandroidx/lifecycle/ProcessLifecycleOwner;->()V PLandroidx/lifecycle/ProcessLifecycleOwner;->()V PLandroidx/lifecycle/ProcessLifecycleOwner;->activityResumed()V PLandroidx/lifecycle/ProcessLifecycleOwner;->activityStarted()V PLandroidx/lifecycle/ProcessLifecycleOwnerInitializer;->()V PLandroidx/lifecycle/ProcessLifecycleOwnerInitializer;->onCreate()Z PLandroidx/lifecycle/RepeatOnLifecycleKt$repeatOnLifecycle$3$1$1$1$1$1$1;->(Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)V PLandroidx/lifecycle/RepeatOnLifecycleKt$repeatOnLifecycle$3$1$1$1$1$1$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLandroidx/lifecycle/RepeatOnLifecycleKt$repeatOnLifecycle$3$1$1$1$1$1$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLandroidx/lifecycle/RepeatOnLifecycleKt$repeatOnLifecycle$3$1$1$1$1;->(Lkotlinx/coroutines/sync/Mutex;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)V PLandroidx/lifecycle/RepeatOnLifecycleKt$repeatOnLifecycle$3$1$1$1$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; PLandroidx/lifecycle/RepeatOnLifecycleKt$repeatOnLifecycle$3$1$1$1;->(Landroidx/lifecycle/Lifecycle$Event;Lkotlin/jvm/internal/Ref$ObjectRef;Lkotlinx/coroutines/CoroutineScope;Landroidx/lifecycle/Lifecycle$Event;Lkotlinx/coroutines/CancellableContinuation;Lkotlinx/coroutines/sync/Mutex;Lkotlin/jvm/functions/Function2;)V PLandroidx/lifecycle/RepeatOnLifecycleKt$repeatOnLifecycle$3$1;->(Landroidx/lifecycle/Lifecycle;Landroidx/lifecycle/Lifecycle$State;Lkotlinx/coroutines/CoroutineScope;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)V PLandroidx/lifecycle/RepeatOnLifecycleKt$repeatOnLifecycle$3$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLandroidx/lifecycle/RepeatOnLifecycleKt$repeatOnLifecycle$3;->(Landroidx/lifecycle/Lifecycle;Landroidx/lifecycle/Lifecycle$State;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)V PLandroidx/lifecycle/RepeatOnLifecycleKt$repeatOnLifecycle$3;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLandroidx/lifecycle/RepeatOnLifecycleKt$repeatOnLifecycle$3;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLandroidx/lifecycle/ReportFragment$LifecycleCallbacks;->()V PLandroidx/lifecycle/ReportFragment$LifecycleCallbacks;->onActivityCreated(Landroid/app/Activity;Landroid/os/Bundle;)V PLandroidx/lifecycle/ReportFragment$LifecycleCallbacks;->onActivityDestroyed(Landroid/app/Activity;)V PLandroidx/lifecycle/ReportFragment$LifecycleCallbacks;->onActivityPaused(Landroid/app/Activity;)V PLandroidx/lifecycle/ReportFragment$LifecycleCallbacks;->onActivityPostCreated(Landroid/app/Activity;Landroid/os/Bundle;)V PLandroidx/lifecycle/ReportFragment$LifecycleCallbacks;->onActivityPostResumed(Landroid/app/Activity;)V PLandroidx/lifecycle/ReportFragment$LifecycleCallbacks;->onActivityPostStarted(Landroid/app/Activity;)V PLandroidx/lifecycle/ReportFragment$LifecycleCallbacks;->onActivityPreDestroyed(Landroid/app/Activity;)V PLandroidx/lifecycle/ReportFragment$LifecycleCallbacks;->onActivityPrePaused(Landroid/app/Activity;)V PLandroidx/lifecycle/ReportFragment$LifecycleCallbacks;->onActivityPreStopped(Landroid/app/Activity;)V PLandroidx/lifecycle/ReportFragment$LifecycleCallbacks;->onActivityResumed(Landroid/app/Activity;)V PLandroidx/lifecycle/ReportFragment$LifecycleCallbacks;->onActivitySaveInstanceState(Landroid/app/Activity;Landroid/os/Bundle;)V PLandroidx/lifecycle/ReportFragment$LifecycleCallbacks;->onActivityStarted(Landroid/app/Activity;)V PLandroidx/lifecycle/ReportFragment$LifecycleCallbacks;->onActivityStopped(Landroid/app/Activity;)V PLandroidx/lifecycle/ReportFragment$LifecycleCallbacks;->registerIn(Landroid/app/Activity;)V PLandroidx/lifecycle/ReportFragment;->()V PLandroidx/lifecycle/ReportFragment;->dispatch(Landroid/app/Activity;Landroidx/lifecycle/Lifecycle$Event;)V PLandroidx/lifecycle/ReportFragment;->dispatch(Landroidx/lifecycle/Lifecycle$Event;)V PLandroidx/lifecycle/ReportFragment;->injectIfNeededIn(Landroid/app/Activity;)V PLandroidx/lifecycle/ReportFragment;->onActivityCreated(Landroid/os/Bundle;)V PLandroidx/lifecycle/ReportFragment;->onDestroy()V PLandroidx/lifecycle/ReportFragment;->onPause()V PLandroidx/lifecycle/ReportFragment;->onResume()V PLandroidx/lifecycle/ReportFragment;->onStart()V PLandroidx/lifecycle/ReportFragment;->onStop()V PLandroidx/lifecycle/SavedStateHandle$1;->(Landroidx/lifecycle/SavedStateHandle;)V PLandroidx/lifecycle/SavedStateHandle$1;->saveState()Landroid/os/Bundle; PLandroidx/lifecycle/SavedStateHandle;->()V PLandroidx/lifecycle/SavedStateHandle;->()V PLandroidx/lifecycle/SavedStateHandleController$1;->(Landroidx/lifecycle/Lifecycle;Landroidx/savedstate/SavedStateRegistry;)V PLandroidx/lifecycle/SavedStateHandleController$1;->onStateChanged(Landroidx/lifecycle/LifecycleOwner;Landroidx/lifecycle/Lifecycle$Event;)V PLandroidx/lifecycle/SavedStateHandleController;->(Ljava/lang/String;Landroidx/lifecycle/SavedStateHandle;)V PLandroidx/lifecycle/SavedStateHandleController;->attachToLifecycle(Landroidx/savedstate/SavedStateRegistry;Landroidx/lifecycle/Lifecycle;)V PLandroidx/lifecycle/SavedStateHandleController;->create(Landroidx/savedstate/SavedStateRegistry;Landroidx/lifecycle/Lifecycle;Ljava/lang/String;Landroid/os/Bundle;)Landroidx/lifecycle/SavedStateHandleController; PLandroidx/lifecycle/SavedStateHandleController;->onStateChanged(Landroidx/lifecycle/LifecycleOwner;Landroidx/lifecycle/Lifecycle$Event;)V PLandroidx/lifecycle/SavedStateHandleController;->tryToAddRecreator(Landroidx/savedstate/SavedStateRegistry;Landroidx/lifecycle/Lifecycle;)V PLandroidx/lifecycle/SavedStateViewModelFactory;->()V PLandroidx/lifecycle/SavedStateViewModelFactory;->(Landroid/app/Application;Landroidx/savedstate/SavedStateRegistryOwner;Landroid/os/Bundle;)V PLandroidx/lifecycle/ViewModel;->()V PLandroidx/lifecycle/ViewModel;->clear()V PLandroidx/lifecycle/ViewModel;->getTag(Ljava/lang/String;)Ljava/lang/Object; PLandroidx/lifecycle/ViewModel;->onCleared()V PLandroidx/lifecycle/ViewModel;->setTagIfAbsent(Ljava/lang/String;Ljava/lang/Object;)Ljava/lang/Object; PLandroidx/lifecycle/ViewModelLazy;->(Lkotlin/reflect/KClass;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;)V PLandroidx/lifecycle/ViewModelLazy;->getValue()Ljava/lang/Object; PLandroidx/lifecycle/ViewModelProvider$AndroidViewModelFactory;->()V PLandroidx/lifecycle/ViewModelProvider$AndroidViewModelFactory;->(Landroid/app/Application;)V PLandroidx/lifecycle/ViewModelProvider$KeyedFactory;->()V PLandroidx/lifecycle/ViewModelProvider$NewInstanceFactory;->()V PLandroidx/lifecycle/ViewModelProvider$NewInstanceFactory;->()V PLandroidx/lifecycle/ViewModelProvider;->(I)V PLandroidx/lifecycle/ViewModelProvider;->(Landroidx/lifecycle/ViewModelStore;Landroidx/lifecycle/ViewModelProvider$Factory;)V PLandroidx/lifecycle/ViewModelProvider;->(Landroidx/lifecycle/ViewModelStoreOwner;Landroidx/lifecycle/ViewModelProvider$Factory;)V PLandroidx/lifecycle/ViewModelProvider;->(Landroidx/room/RoomDatabase;)V PLandroidx/lifecycle/ViewModelProvider;->(Lcom/google/android/gms/common/GoogleApiAvailabilityLight;)V PLandroidx/lifecycle/ViewModelProvider;->(Lcom/google/android/gms/measurement/internal/zzjm;)V PLandroidx/lifecycle/ViewModelProvider;->(Ljava/lang/Object;Ljava/lang/Object;I)V PLandroidx/lifecycle/ViewModelProvider;->(Ljava/lang/Object;Ljava/lang/Object;ILandroidx/appcompat/R$id$$IA$1;)V PLandroidx/lifecycle/ViewModelProvider;->(Ljava/lang/String;)V PLandroidx/lifecycle/ViewModelProvider;->bindTo(Landroidx/sqlite/db/SupportSQLiteProgram;)V PLandroidx/lifecycle/ViewModelProvider;->calculateHexStringDigest(Lcom/bumptech/glide/load/Key;)Ljava/lang/String; PLandroidx/lifecycle/ViewModelProvider;->create()Z PLandroidx/lifecycle/ViewModelProvider;->getClientAvailability(Landroid/content/Context;Lcom/google/android/gms/common/api/Api$Client;)I PLandroidx/lifecycle/ViewModelProvider;->getMarkerFile()Ljava/io/File; PLandroidx/lifecycle/ViewModelProvider;->getSafeKey(Lcom/bumptech/glide/load/Key;)Ljava/lang/String; PLandroidx/lifecycle/ViewModelProvider;->getSql()Ljava/lang/String; PLandroidx/lifecycle/ViewModelProvider;->releaseAndClose()V PLandroidx/lifecycle/ViewModelStore;->()V PLandroidx/lifecycle/ViewModelStore;->clear()V PLandroidx/loader/app/LoaderManager;->()V PLandroidx/loader/app/LoaderManager;->getInstance(Landroidx/lifecycle/LifecycleOwner;)Landroidx/loader/app/LoaderManager; PLandroidx/loader/app/LoaderManagerImpl$LoaderViewModel;->()V PLandroidx/loader/app/LoaderManagerImpl$LoaderViewModel;->()V PLandroidx/loader/app/LoaderManagerImpl$LoaderViewModel;->onCleared()V PLandroidx/loader/app/LoaderManagerImpl;->(Landroidx/lifecycle/LifecycleOwner;Landroidx/lifecycle/ViewModelStore;)V PLandroidx/loader/content/ModernAsyncTask$1;->(I)V PLandroidx/loader/content/ModernAsyncTask$1;->newThread(Ljava/lang/Runnable;)Ljava/lang/Thread; PLandroidx/navigation/ActivityNavigator;->(Landroid/content/Context;)V PLandroidx/navigation/NavAction;->(ILandroidx/navigation/NavOptions;Landroid/os/Bundle;I)V PLandroidx/navigation/NavArgument;->(Landroidx/navigation/NavType;ZLjava/lang/Object;Z)V PLandroidx/navigation/NavArgument;->equals(Ljava/lang/Object;)Z PLandroidx/navigation/NavArgument;->hashCode()I PLandroidx/navigation/NavBackStackEntry$defaultFactory$2;->(Landroidx/navigation/NavBackStackEntry;I)V PLandroidx/navigation/NavBackStackEntry;->()V PLandroidx/navigation/NavBackStackEntry;->getLifecycle()Landroidx/lifecycle/Lifecycle; PLandroidx/navigation/NavBackStackEntry;->getSavedStateRegistry()Landroidx/savedstate/SavedStateRegistry; PLandroidx/navigation/NavBackStackEntry;->setMaxLifecycle(Landroidx/lifecycle/Lifecycle$State;)V PLandroidx/navigation/NavBackStackEntryState;->()V PLandroidx/navigation/NavBackStackEntryState;->(Landroidx/navigation/NavBackStackEntry;)V PLandroidx/navigation/NavBackStackEntryState;->writeToParcel(Landroid/os/Parcel;I)V PLandroidx/navigation/NavController$$ExternalSyntheticLambda0;->(Ljava/lang/Object;I)V PLandroidx/navigation/NavController$NavControllerNavigatorState;->(Landroidx/navigation/NavHostController;Landroidx/navigation/Navigator;)V PLandroidx/navigation/NavController$NavControllerNavigatorState;->addInternal(Landroidx/navigation/NavBackStackEntry;)V PLandroidx/navigation/NavController$NavControllerNavigatorState;->createBackStackEntry(Landroidx/navigation/NavDestination;Landroid/os/Bundle;)Landroidx/navigation/NavBackStackEntry; PLandroidx/navigation/NavController$NavControllerNavigatorState;->push(Landroidx/navigation/NavBackStackEntry;)V PLandroidx/navigation/NavController$activity$1;->()V PLandroidx/navigation/NavController$activity$1;->(I)V PLandroidx/navigation/NavController$activity$1;->invoke(Landroidx/navigation/NavDestination;)Landroidx/navigation/NavDestination; PLandroidx/navigation/NavController$activity$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; PLandroidx/navigation/NavController$navigate$4;->(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;I)V PLandroidx/navigation/NavController$navigate$4;->invoke(Ljava/lang/Object;)Ljava/lang/Object; PLandroidx/navigation/NavControllerViewModel;->()V PLandroidx/navigation/NavControllerViewModel;->()V PLandroidx/navigation/NavControllerViewModel;->onCleared()V PLandroidx/navigation/NavDestination;->()V PLandroidx/navigation/NavDestination;->addInDefaultArgs(Landroid/os/Bundle;)Landroid/os/Bundle; PLandroidx/navigation/NavDestination;->getArguments()Ljava/util/Map; PLandroidx/navigation/NavDestination;->matchDeepLink(Lcom/google/firebase/iid/zzk;)Landroidx/navigation/NavDestination$DeepLinkMatch; PLandroidx/navigation/NavDestination;->setId(I)V PLandroidx/navigation/NavGraph$iterator$1;->(Landroidx/navigation/NavGraph;)V PLandroidx/navigation/NavGraph$iterator$1;->hasNext()Z PLandroidx/navigation/NavGraph$iterator$1;->next()Ljava/lang/Object; PLandroidx/navigation/NavGraph;->()V PLandroidx/navigation/NavGraph;->(Landroidx/navigation/Navigator;)V PLandroidx/navigation/NavGraph;->addDestination(Landroidx/navigation/NavDestination;)V PLandroidx/navigation/NavGraph;->equals(Ljava/lang/Object;)Z PLandroidx/navigation/NavGraph;->findNode(IZ)Landroidx/navigation/NavDestination; PLandroidx/navigation/NavGraph;->hashCode()I PLandroidx/navigation/NavGraph;->matchDeepLink(Lcom/google/firebase/iid/zzk;)Landroidx/navigation/NavDestination$DeepLinkMatch; PLandroidx/navigation/NavGraph;->onInflate(Landroid/content/Context;Landroid/util/AttributeSet;)V PLandroidx/navigation/NavGraphNavigator;->(Landroidx/navigation/NavigatorProvider;)V PLandroidx/navigation/NavGraphNavigator;->createDestination()Landroidx/navigation/NavDestination; PLandroidx/navigation/NavGraphNavigator;->navigate(Landroidx/navigation/NavBackStackEntry;Landroidx/navigation/NavOptions;Landroidx/navigation/Navigator$Extras;)V PLandroidx/navigation/NavGraphNavigator;->navigate(Ljava/util/List;Landroidx/navigation/NavOptions;Landroidx/navigation/Navigator$Extras;)V PLandroidx/navigation/NavHostController;->addOnDestinationChangedListener(Landroidx/navigation/NavController$OnDestinationChangedListener;)V PLandroidx/navigation/NavHostController;->dispatchOnDestinationChanged()Z PLandroidx/navigation/NavHostController;->findDestination(I)Landroidx/navigation/NavDestination; PLandroidx/navigation/NavHostController;->getBackStackEntry(I)Landroidx/navigation/NavBackStackEntry; PLandroidx/navigation/NavHostController;->getCurrentDestination()Landroidx/navigation/NavDestination; PLandroidx/navigation/NavHostController;->getDestinationCountOnBackStack()I PLandroidx/navigation/NavHostController;->getGraph()Landroidx/navigation/NavGraph; PLandroidx/navigation/NavHostController;->getHostLifecycleState$navigation_runtime_release()Landroidx/lifecycle/Lifecycle$State; PLandroidx/navigation/NavHostController;->linkChildToParent(Landroidx/navigation/NavBackStackEntry;Landroidx/navigation/NavBackStackEntry;)V PLandroidx/navigation/NavHostController;->navigate(Landroidx/navigation/NavDestination;Landroid/os/Bundle;Landroidx/navigation/NavOptions;Landroidx/navigation/Navigator$Extras;)V PLandroidx/navigation/NavHostController;->populateVisibleEntries$navigation_runtime_release()Ljava/util/List; PLandroidx/navigation/NavHostController;->setGraph(Landroidx/navigation/NavGraph;Landroid/os/Bundle;)V PLandroidx/navigation/NavHostController;->updateOnBackPressedCallbackEnabled()V PLandroidx/navigation/NavInflater;->()V PLandroidx/navigation/NavInflater;->(Landroid/content/Context;Landroidx/navigation/NavigatorProvider;)V PLandroidx/navigation/NavInflater;->inflate(I)Landroidx/navigation/NavGraph; PLandroidx/navigation/NavOptions;->(ZZIZZIIII)V PLandroidx/navigation/NavOptions;->hashCode()I PLandroidx/navigation/NavType$Companion$IntType$1;->(I)V PLandroidx/navigation/NavType$Companion$IntType$1;->(ILandroidx/appcompat/R$id$$IA$1;)V PLandroidx/navigation/NavType$Companion$IntType$1;->getName()Ljava/lang/String; PLandroidx/navigation/NavType$Companion$IntType$1;->parseValue(Ljava/lang/String;)Ljava/lang/Object; PLandroidx/navigation/NavType$Companion$IntType$1;->put(Landroid/os/Bundle;Ljava/lang/String;Ljava/lang/Object;)V PLandroidx/navigation/NavType$Companion;->(I)V PLandroidx/navigation/NavType$Companion;->(Lkotlin/LazyKt__LazyKt;I)V PLandroidx/navigation/NavType$Companion;->create$default(Landroidx/navigation/NavType$Companion;Landroid/content/Context;Landroidx/navigation/NavDestination;Landroid/os/Bundle;Landroidx/lifecycle/Lifecycle$State;Landroidx/navigation/NavViewModelStoreProvider;Ljava/lang/String;Landroid/os/Bundle;I)Landroidx/navigation/NavBackStackEntry; PLandroidx/navigation/NavType$Companion;->create(Landroid/content/Context;Landroidx/navigation/NavDestination;Landroid/os/Bundle;Landroidx/lifecycle/Lifecycle$State;Landroidx/navigation/NavViewModelStoreProvider;Ljava/lang/String;Landroid/os/Bundle;)Landroidx/navigation/NavBackStackEntry; PLandroidx/navigation/NavType$Companion;->create(Landroidx/sqlite/db/SupportSQLiteOpenHelper$Configuration;)Landroidx/sqlite/db/SupportSQLiteOpenHelper; PLandroidx/navigation/NavType$Companion;->getDisplayName(Landroid/content/Context;I)Ljava/lang/String; PLandroidx/navigation/NavType$Companion;->getHierarchy(Landroidx/navigation/NavDestination;)Lkotlin/sequences/Sequence; PLandroidx/navigation/NavType$Companion;->getInstance(Landroidx/lifecycle/ViewModelStore;)Landroidx/navigation/NavControllerViewModel; PLandroidx/navigation/NavType$Companion;->getNameForNavigator$navigation_common_release(Ljava/lang/Class;)Ljava/lang/String; PLandroidx/navigation/NavType$Companion;->onResultReceived(ILjava/lang/Object;)V PLandroidx/navigation/NavType$Companion;->parse(Ljava/lang/String;)Landroidx/window/core/Version; PLandroidx/navigation/NavType$Companion;->validateName$navigation_common_release(Ljava/lang/String;)Z PLandroidx/navigation/NavType;->()V PLandroidx/navigation/NavType;->(Z)V PLandroidx/navigation/Navigator;->()V PLandroidx/navigation/Navigator;->getState()Landroidx/navigation/NavController$NavControllerNavigatorState; PLandroidx/navigation/Navigator;->onAttach(Landroidx/navigation/NavController$NavControllerNavigatorState;)V PLandroidx/navigation/Navigator;->onSaveState()Landroid/os/Bundle; PLandroidx/navigation/NavigatorProvider;->()V PLandroidx/navigation/NavigatorProvider;->()V PLandroidx/navigation/NavigatorProvider;->addNavigator(Landroidx/navigation/Navigator;)Landroidx/navigation/Navigator; PLandroidx/navigation/R$id;->()V PLandroidx/navigation/R$id;->checkArgument(Z)V PLandroidx/navigation/R$id;->checkArgument(ZLjava/lang/Object;)V PLandroidx/navigation/R$id;->checkArgument(ZLjava/lang/String;[Ljava/lang/Object;)V PLandroidx/navigation/R$id;->checkHandlerThread(Landroid/os/Handler;Ljava/lang/String;)V PLandroidx/navigation/R$id;->checkMainThread(Ljava/lang/String;)V PLandroidx/navigation/R$id;->checkNotEmpty(Ljava/lang/String;Ljava/lang/Object;)Ljava/lang/String; PLandroidx/navigation/R$id;->checkNotMainThread(Ljava/lang/String;)V PLandroidx/navigation/R$id;->checkNotNull(Ljava/lang/Object;)Ljava/lang/Object; PLandroidx/navigation/R$id;->checkNotNull(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLandroidx/navigation/R$id;->checkState(Z)V PLandroidx/navigation/R$id;->checkState(ZLjava/lang/Object;)V PLandroidx/navigation/R$id;->compress([B)[B PLandroidx/navigation/R$id;->findChildViewById(Landroid/view/View;I)Landroid/view/View; PLandroidx/navigation/R$id;->getOrientation(Ljava/util/List;Ljava/io/InputStream;Lcom/bumptech/glide/load/engine/bitmap_recycle/LruArrayPool;)I PLandroidx/navigation/R$id;->getType(Ljava/util/List;Ljava/io/InputStream;Lcom/bumptech/glide/load/engine/bitmap_recycle/LruArrayPool;)Lcom/bumptech/glide/load/ImageHeaderParser$ImageType; PLandroidx/navigation/R$id;->isMediaStoreUri(Landroid/net/Uri;)Z PLandroidx/navigation/R$id;->isWearable(Landroid/content/Context;)Z PLandroidx/navigation/R$id;->isWearableWithoutPlayStore(Landroid/content/Context;)Z PLandroidx/navigation/R$id;->readCompressed(Ljava/io/InputStream;II)[B PLandroidx/navigation/R$id;->readString(Ljava/io/InputStream;I)Ljava/lang/String; PLandroidx/navigation/R$id;->readUInt32(Ljava/io/InputStream;)J PLandroidx/navigation/R$id;->readUInt8(Ljava/io/InputStream;)I PLandroidx/navigation/R$id;->resumeCancellableWith$default(Lkotlin/coroutines/Continuation;Ljava/lang/Object;Lkotlin/jvm/functions/Function1;I)V PLandroidx/navigation/R$id;->uidHasPackageName(Landroid/content/Context;ILjava/lang/String;)Z PLandroidx/navigation/R$id;->utf8Length(Ljava/lang/String;)I PLandroidx/navigation/R$id;->writeString(Ljava/io/OutputStream;Ljava/lang/String;)V PLandroidx/navigation/R$id;->zza(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; PLandroidx/navigation/R$id;->zza(Ljava/lang/String;[Ljava/lang/String;[Ljava/lang/String;)Ljava/lang/String; PLandroidx/navigation/fragment/DialogFragmentNavigator$$ExternalSyntheticLambda0;->(Landroidx/navigation/fragment/DialogFragmentNavigator;)V PLandroidx/navigation/fragment/DialogFragmentNavigator$$ExternalSyntheticLambda0;->onAttachFragment(Landroidx/fragment/app/FragmentManager;Landroidx/fragment/app/Fragment;)V PLandroidx/navigation/fragment/DialogFragmentNavigator;->(Landroid/content/Context;Landroidx/fragment/app/FragmentManager;)V PLandroidx/navigation/fragment/DialogFragmentNavigator;->onAttach(Landroidx/navigation/NavController$NavControllerNavigatorState;)V PLandroidx/navigation/fragment/FragmentNavigator$Destination;->(Landroidx/navigation/Navigator;)V PLandroidx/navigation/fragment/FragmentNavigator$Destination;->equals(Ljava/lang/Object;)Z PLandroidx/navigation/fragment/FragmentNavigator$Destination;->hashCode()I PLandroidx/navigation/fragment/FragmentNavigator;->(Landroid/content/Context;Landroidx/fragment/app/FragmentManager;I)V PLandroidx/navigation/fragment/FragmentNavigator;->createDestination()Landroidx/navigation/NavDestination; PLandroidx/navigation/fragment/FragmentNavigator;->onSaveState()Landroid/os/Bundle; PLandroidx/navigation/fragment/NavHostFragment;->()V PLandroidx/navigation/fragment/NavHostFragment;->()V PLandroidx/navigation/fragment/NavHostFragment;->getNavController()Landroidx/navigation/NavHostController; PLandroidx/navigation/fragment/NavHostFragment;->onAttach(Landroid/content/Context;)V PLandroidx/navigation/fragment/NavHostFragment;->onCreateView(Landroid/view/LayoutInflater;Landroid/view/ViewGroup;Landroid/os/Bundle;)Landroid/view/View; PLandroidx/navigation/fragment/NavHostFragment;->onDestroyView()V PLandroidx/navigation/fragment/NavHostFragment;->onInflate(Landroid/content/Context;Landroid/util/AttributeSet;Landroid/os/Bundle;)V PLandroidx/navigation/fragment/NavHostFragment;->onPrimaryNavigationFragmentChanged(Z)V PLandroidx/navigation/fragment/NavHostFragment;->onSaveInstanceState(Landroid/os/Bundle;)V PLandroidx/navigation/fragment/NavHostFragment;->onViewCreated(Landroid/view/View;Landroid/os/Bundle;)V PLandroidx/navigation/ui/NavigationUI$$ExternalSyntheticLambda1;->(Ljava/lang/Object;I)V PLandroidx/navigation/ui/NavigationUI$$ExternalSyntheticLambda1;->onApplyWindowInsets(Landroid/view/View;Landroidx/core/view/WindowInsetsCompat;)Landroidx/core/view/WindowInsetsCompat; PLandroidx/navigation/ui/NavigationUI$setupWithNavController$9;->(Ljava/lang/ref/WeakReference;Landroidx/navigation/NavHostController;)V PLandroidx/navigation/ui/NavigationUI$setupWithNavController$9;->onDestinationChanged(Landroidx/navigation/NavHostController;Landroidx/navigation/NavDestination;Landroid/os/Bundle;)V PLandroidx/profileinstaller/DeviceProfileWriter;->(Landroid/content/res/AssetManager;Ljava/util/concurrent/Executor;Landroidx/profileinstaller/ProfileInstaller$DiagnosticsCallback;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/io/File;)V PLandroidx/profileinstaller/DeviceProfileWriter;->assertDeviceAllowsProfileInstallerAotWritesCalled()V PLandroidx/profileinstaller/DeviceProfileWriter;->result(ILjava/lang/Object;)V PLandroidx/profileinstaller/DexProfileData;->(Ljava/lang/String;Ljava/lang/String;JJIII[ILjava/util/TreeMap;)V PLandroidx/profileinstaller/ProfileInstaller$$ExternalSyntheticLambda0;->(Ljava/lang/Object;ILjava/lang/Object;I)V PLandroidx/profileinstaller/ProfileInstaller$$ExternalSyntheticLambda0;->run()V PLandroidx/profileinstaller/ProfileInstaller$$ExternalSyntheticLambda1;->()V PLandroidx/profileinstaller/ProfileInstaller$$ExternalSyntheticLambda1;->(I)V PLandroidx/profileinstaller/ProfileInstaller$$ExternalSyntheticLambda1;->execute(Ljava/lang/Runnable;)V PLandroidx/profileinstaller/ProfileInstallerInitializer$$ExternalSyntheticLambda0;->(Landroid/content/Context;I)V PLandroidx/profileinstaller/ProfileInstallerInitializer$$ExternalSyntheticLambda0;->run()V PLandroidx/profileinstaller/ProfileInstallerInitializer$Choreographer16Impl$$ExternalSyntheticLambda0;->(Ljava/lang/Runnable;)V PLandroidx/profileinstaller/ProfileInstallerInitializer$Choreographer16Impl$$ExternalSyntheticLambda0;->doFrame(J)V PLandroidx/profileinstaller/ProfileInstallerInitializer$Choreographer16Impl;->postFrameCallback(Ljava/lang/Runnable;)V PLandroidx/profileinstaller/ProfileInstallerInitializer$Handler28Impl;->createAsync(Landroid/os/Looper;)Landroid/os/Handler; PLandroidx/profileinstaller/ProfileInstallerInitializer;->()V PLandroidx/profileinstaller/ProfileInstallerInitializer;->create(Landroid/content/Context;)Ljava/lang/Object; PLandroidx/profileinstaller/ProfileInstallerInitializer;->dependencies()Ljava/util/List; PLandroidx/profileinstaller/WritableFileSection;->(II[BZ)V PLandroidx/recyclerview/widget/AdapterHelper$UpdateOp;->(IIILjava/lang/Object;)V PLandroidx/recyclerview/widget/AdapterHelper;->canFindInPreLayout(I)Z PLandroidx/recyclerview/widget/AdapterHelper;->dispatchFirstPassAndUpdateViewHolders(Landroidx/recyclerview/widget/AdapterHelper$UpdateOp;I)V PLandroidx/recyclerview/widget/AdapterHelper;->postponeAndUpdateViewHolders(Landroidx/recyclerview/widget/AdapterHelper$UpdateOp;)V PLandroidx/recyclerview/widget/AdapterHelper;->recycleUpdateOp(Landroidx/recyclerview/widget/AdapterHelper$UpdateOp;)V PLandroidx/recyclerview/widget/AdapterHelper;->updatePositionWithPostponed(II)I PLandroidx/recyclerview/widget/AsyncDifferConfig$Builder;->()V PLandroidx/recyclerview/widget/AsyncDifferConfig$Builder;->(Lokio/SegmentPool;)V PLandroidx/recyclerview/widget/AsyncDifferConfig$Builder;->build()Landroidx/recyclerview/widget/ChildHelper; PLandroidx/recyclerview/widget/AsyncListDiffer$1$2;->(Ljava/lang/Object;Ljava/lang/Object;I)V PLandroidx/recyclerview/widget/AsyncListDiffer$1;->(Landroidx/recyclerview/widget/AsyncListDiffer;Ljava/util/List;Ljava/util/List;ILjava/lang/Runnable;)V PLandroidx/recyclerview/widget/AsyncListDiffer$MainThreadExecutor;->()V PLandroidx/recyclerview/widget/AsyncListDiffer$MainThreadExecutor;->execute(Ljava/lang/Runnable;)V PLandroidx/recyclerview/widget/AsyncListDiffer;->()V PLandroidx/recyclerview/widget/AsyncListDiffer;->(Landroidx/recyclerview/widget/ListUpdateCallback;Landroidx/recyclerview/widget/ChildHelper;)V PLandroidx/recyclerview/widget/AsyncListDiffer;->onCurrentListChanged(Ljava/util/List;Ljava/lang/Runnable;)V PLandroidx/recyclerview/widget/AsyncListDiffer;->submitList(Ljava/util/List;)V PLandroidx/recyclerview/widget/BatchingListUpdateCallback;->(Landroidx/recyclerview/widget/ListUpdateCallback;)V PLandroidx/recyclerview/widget/BatchingListUpdateCallback;->dispatchLastEvent()V PLandroidx/recyclerview/widget/BatchingListUpdateCallback;->onChanged(IILjava/lang/Object;)V PLandroidx/recyclerview/widget/ChildHelper$Bucket;->()V PLandroidx/recyclerview/widget/ChildHelper$Bucket;->(Lcom/google/android/gms/common/util/Clock;)V PLandroidx/recyclerview/widget/ChildHelper$Bucket;->set(I)V PLandroidx/recyclerview/widget/ChildHelper;->(Ljava/util/concurrent/Executor;Ljava/util/concurrent/Executor;Lokio/SegmentPool;)V PLandroidx/recyclerview/widget/ChildHelper;->hideViewInternal(Landroid/view/View;)V PLandroidx/recyclerview/widget/ChildHelper;->unhideViewInternal(Landroid/view/View;)Z PLandroidx/recyclerview/widget/DefaultItemAnimator$4;->(Landroidx/recyclerview/widget/DefaultItemAnimator;Landroidx/recyclerview/widget/RecyclerView$ViewHolder;Landroid/view/View;Landroid/view/ViewPropertyAnimator;)V PLandroidx/recyclerview/widget/DefaultItemAnimator$4;->onAnimationEnd(Landroid/animation/Animator;)V PLandroidx/recyclerview/widget/DefaultItemAnimator$4;->onAnimationStart(Landroid/animation/Animator;)V PLandroidx/recyclerview/widget/DefaultItemAnimator$7;->(Landroidx/recyclerview/widget/DefaultItemAnimator;Landroidx/recyclerview/widget/DefaultItemAnimator$ChangeInfo;Landroid/view/ViewPropertyAnimator;Landroid/view/View;I)V PLandroidx/recyclerview/widget/DefaultItemAnimator$7;->onAnimationEnd(Landroid/animation/Animator;)V PLandroidx/recyclerview/widget/DefaultItemAnimator$7;->onAnimationStart(Landroid/animation/Animator;)V PLandroidx/recyclerview/widget/DefaultItemAnimator$ChangeInfo;->(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;Landroidx/recyclerview/widget/RecyclerView$ViewHolder;IIII)V PLandroidx/recyclerview/widget/DefaultItemAnimator;->animateChange(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;Landroidx/recyclerview/widget/RecyclerView$ViewHolder;Lcom/google/android/material/internal/ViewUtils$RelativePadding;Lcom/google/android/material/internal/ViewUtils$RelativePadding;)Z PLandroidx/recyclerview/widget/DefaultItemAnimator;->dispatchFinishedWhenDone()V PLandroidx/recyclerview/widget/DefaultItemAnimator;->endAnimation(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;)V PLandroidx/recyclerview/widget/DefaultItemAnimator;->endChangeAnimation(Ljava/util/List;Landroidx/recyclerview/widget/RecyclerView$ViewHolder;)V PLandroidx/recyclerview/widget/DefaultItemAnimator;->resetAnimation(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;)V PLandroidx/recyclerview/widget/DiffUtil$Range;->()V PLandroidx/recyclerview/widget/DiffUtil$Range;->(IIII)V PLandroidx/recyclerview/widget/DiffUtil$Snake;->()V PLandroidx/recyclerview/widget/FastScroller$2;->(Ljava/lang/Object;I)V PLandroidx/recyclerview/widget/FastScroller$2;->onScrollStateChanged(Landroidx/recyclerview/widget/RecyclerView;I)V PLandroidx/recyclerview/widget/GapWorker$Task;->()V PLandroidx/recyclerview/widget/GapWorker;->()V PLandroidx/recyclerview/widget/GapWorker;->()V PLandroidx/recyclerview/widget/LinearLayoutManager$AnchorInfo;->()V PLandroidx/recyclerview/widget/LinearLayoutManager$AnchorInfo;->assignCoordinateFromPadding()V PLandroidx/recyclerview/widget/LinearLayoutManager$LayoutChunkResult;->()V PLandroidx/recyclerview/widget/LinearLayoutManager$LayoutState;->()V PLandroidx/recyclerview/widget/LinearLayoutManager$SavedState;->()V PLandroidx/recyclerview/widget/LinearLayoutManager$SavedState;->()V PLandroidx/recyclerview/widget/LinearLayoutManager$SavedState;->writeToParcel(Landroid/os/Parcel;I)V PLandroidx/recyclerview/widget/LinearLayoutManager;->(Landroid/content/Context;Landroid/util/AttributeSet;II)V PLandroidx/recyclerview/widget/LinearLayoutManager;->assertNotInLayoutOrScroll(Ljava/lang/String;)V PLandroidx/recyclerview/widget/LinearLayoutManager;->computeHorizontalScrollExtent(Landroidx/recyclerview/widget/RecyclerView$State;)I PLandroidx/recyclerview/widget/LinearLayoutManager;->computeHorizontalScrollOffset(Landroidx/recyclerview/widget/RecyclerView$State;)I PLandroidx/recyclerview/widget/LinearLayoutManager;->computeHorizontalScrollRange(Landroidx/recyclerview/widget/RecyclerView$State;)I PLandroidx/recyclerview/widget/LinearLayoutManager;->findFirstReferenceChild(Landroidx/recyclerview/widget/RecyclerView$Recycler;Landroidx/recyclerview/widget/RecyclerView$State;)Landroid/view/View; PLandroidx/recyclerview/widget/LinearLayoutManager;->isAutoMeasureEnabled()Z PLandroidx/recyclerview/widget/LinearLayoutManager;->onAnchorReady(Landroidx/recyclerview/widget/RecyclerView$Recycler;Landroidx/recyclerview/widget/RecyclerView$State;Landroidx/recyclerview/widget/LinearLayoutManager$AnchorInfo;I)V PLandroidx/recyclerview/widget/LinearLayoutManager;->onDetachedFromWindow(Landroidx/recyclerview/widget/RecyclerView;Landroidx/recyclerview/widget/RecyclerView$Recycler;)V PLandroidx/recyclerview/widget/LinearLayoutManager;->onSaveInstanceState()Landroid/os/Parcelable; PLandroidx/recyclerview/widget/LinearLayoutManager;->setOrientation(I)V PLandroidx/recyclerview/widget/LinearLayoutManager;->setStackFromEnd(Z)V PLandroidx/recyclerview/widget/LinearSmoothScroller;->(Landroid/content/Context;)V PLandroidx/recyclerview/widget/ListAdapter$1;->(Landroidx/recyclerview/widget/ListAdapter;)V PLandroidx/recyclerview/widget/ListAdapter;->(Lokio/SegmentPool;)V PLandroidx/recyclerview/widget/OpReorderer;->(Landroidx/recyclerview/widget/AsyncListDiffer$1;)V PLandroidx/recyclerview/widget/OpReorderer;->(Ljava/lang/Object;)V PLandroidx/recyclerview/widget/OpReorderer;->onChanged(IILjava/lang/Object;)V PLandroidx/recyclerview/widget/OpReorderer;->onInserted(II)V PLandroidx/recyclerview/widget/OrientationHelper$1;->(Landroidx/recyclerview/widget/RecyclerView$LayoutManager;I)V PLandroidx/recyclerview/widget/OrientationHelper;->(Landroidx/recyclerview/widget/RecyclerView$LayoutManager;Landroidx/recyclerview/widget/OrientationHelper$1;)V PLandroidx/recyclerview/widget/OrientationHelper;->createHorizontalHelper(Landroidx/recyclerview/widget/RecyclerView$LayoutManager;)Landroidx/recyclerview/widget/OrientationHelper; PLandroidx/recyclerview/widget/OrientationHelper;->createOrientationHelper(Landroidx/recyclerview/widget/RecyclerView$LayoutManager;I)Landroidx/recyclerview/widget/OrientationHelper; PLandroidx/recyclerview/widget/OrientationHelper;->createVerticalHelper(Landroidx/recyclerview/widget/RecyclerView$LayoutManager;)Landroidx/recyclerview/widget/OrientationHelper; PLandroidx/recyclerview/widget/RecyclerView$1;->(Landroidx/recyclerview/widget/RecyclerView;I)V PLandroidx/recyclerview/widget/RecyclerView$1;->run()V PLandroidx/recyclerview/widget/RecyclerView$4;->(Landroidx/recyclerview/widget/RecyclerView;)V PLandroidx/recyclerview/widget/RecyclerView$4;->dispatchUpdate(Landroidx/recyclerview/widget/AdapterHelper$UpdateOp;)V PLandroidx/recyclerview/widget/RecyclerView$4;->offsetPositionsForAdd(II)V PLandroidx/recyclerview/widget/RecyclerView$4;->processAppeared(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;Lcom/google/android/material/internal/ViewUtils$RelativePadding;Lcom/google/android/material/internal/ViewUtils$RelativePadding;)V PLandroidx/recyclerview/widget/RecyclerView$Adapter;->()V PLandroidx/recyclerview/widget/RecyclerView$Adapter;->getItemViewType(I)I PLandroidx/recyclerview/widget/RecyclerView$Adapter;->onAttachedToRecyclerView(Landroidx/recyclerview/widget/RecyclerView;)V PLandroidx/recyclerview/widget/RecyclerView$Adapter;->onDetachedFromRecyclerView(Landroidx/recyclerview/widget/RecyclerView;)V PLandroidx/recyclerview/widget/RecyclerView$Adapter;->onViewAttachedToWindow(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;)V PLandroidx/recyclerview/widget/RecyclerView$Adapter;->onViewDetachedFromWindow(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;)V PLandroidx/recyclerview/widget/RecyclerView$Adapter;->onViewRecycled(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;)V PLandroidx/recyclerview/widget/RecyclerView$Adapter;->setHasStableIds(Z)V PLandroidx/recyclerview/widget/RecyclerView$AdapterDataObservable;->()V PLandroidx/recyclerview/widget/RecyclerView$AdapterDataObservable;->hasObservers()Z PLandroidx/recyclerview/widget/RecyclerView$AdapterDataObservable;->notifyItemRangeChanged(IILjava/lang/Object;)V PLandroidx/recyclerview/widget/RecyclerView$AdapterDataObservable;->notifyItemRangeInserted(II)V PLandroidx/recyclerview/widget/RecyclerView$AdapterDataObserver;->()V PLandroidx/recyclerview/widget/RecyclerView$EdgeEffectFactory;->()V PLandroidx/recyclerview/widget/RecyclerView$ItemAnimator;->buildAdapterChangeFlagsForAnimations(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;)I PLandroidx/recyclerview/widget/RecyclerView$ItemAnimator;->dispatchAnimationFinished(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;)V PLandroidx/recyclerview/widget/RecyclerView$ItemAnimator;->dispatchAnimationsFinished()V PLandroidx/recyclerview/widget/RecyclerView$ItemAnimator;->recordPreLayoutInformation(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;)Lcom/google/android/material/internal/ViewUtils$RelativePadding; PLandroidx/recyclerview/widget/RecyclerView$ItemDecoration;->()V PLandroidx/recyclerview/widget/RecyclerView$ItemDecoration;->onDraw(Landroid/graphics/Canvas;Landroidx/recyclerview/widget/RecyclerView;Landroidx/recyclerview/widget/RecyclerView$State;)V PLandroidx/recyclerview/widget/RecyclerView$ItemDecoration;->onDrawOver(Landroid/graphics/Canvas;Landroidx/recyclerview/widget/RecyclerView;Landroidx/recyclerview/widget/RecyclerView$State;)V PLandroidx/recyclerview/widget/RecyclerView$LayoutManager$1;->(Landroidx/recyclerview/widget/RecyclerView$LayoutManager;I)V PLandroidx/recyclerview/widget/RecyclerView$LayoutManager$Properties;->()V PLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->checkLayoutParams(Landroidx/recyclerview/widget/RecyclerView$LayoutParams;)Z PLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->collectAdjacentPrefetchPositions(IILandroidx/recyclerview/widget/RecyclerView$State;Lcom/google/android/gms/internal/vision/zzfc;)V PLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->collectInitialPrefetchPositions(ILcom/google/android/gms/internal/vision/zzfc;)V PLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->generateLayoutParams(Landroid/content/Context;Landroid/util/AttributeSet;)Landroidx/recyclerview/widget/RecyclerView$LayoutParams; PLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getColumnCountForAccessibility(Landroidx/recyclerview/widget/RecyclerView$Recycler;Landroidx/recyclerview/widget/RecyclerView$State;)I PLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getProperties(Landroid/content/Context;Landroid/util/AttributeSet;II)Landroidx/recyclerview/widget/RecyclerView$LayoutManager$Properties; PLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getRowCountForAccessibility(Landroidx/recyclerview/widget/RecyclerView$Recycler;Landroidx/recyclerview/widget/RecyclerView$State;)I PLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->isAutoMeasureEnabled()Z PLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->onAdapterChanged(Landroidx/recyclerview/widget/RecyclerView$Adapter;Landroidx/recyclerview/widget/RecyclerView$Adapter;)V PLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->onAttachedToWindow(Landroidx/recyclerview/widget/RecyclerView;)V PLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->onItemsAdded(Landroidx/recyclerview/widget/RecyclerView;II)V PLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->onItemsUpdated(Landroidx/recyclerview/widget/RecyclerView;II)V PLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->onItemsUpdated(Landroidx/recyclerview/widget/RecyclerView;IILjava/lang/Object;)V PLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->onScrollStateChanged(I)V PLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->removeAllViews()V PLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->requestLayout()V PLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->shouldMeasureTwice()Z PLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->supportsPredictiveItemAnimations()Z PLandroidx/recyclerview/widget/RecyclerView$OnScrollListener;->()V PLandroidx/recyclerview/widget/RecyclerView$RecycledViewPool$ScrapData;->()V PLandroidx/recyclerview/widget/RecyclerView$RecycledViewPool;->()V PLandroidx/recyclerview/widget/RecyclerView$RecycledViewPool;->runningAverage(JJ)J PLandroidx/recyclerview/widget/RecyclerView$RecyclerViewDataObserver;->(Ljava/lang/Object;I)V PLandroidx/recyclerview/widget/RecyclerView$RecyclerViewDataObserver;->onItemRangeInserted(II)V PLandroidx/recyclerview/widget/RecyclerView$RecyclerViewDataObserver;->triggerUpdateProcessor()V PLandroidx/recyclerview/widget/RecyclerView$SavedState;->()V PLandroidx/recyclerview/widget/RecyclerView$SavedState;->(Landroid/os/Parcelable;)V PLandroidx/recyclerview/widget/RecyclerView$SavedState;->writeToParcel(Landroid/os/Parcel;I)V PLandroidx/recyclerview/widget/RecyclerView$SmoothScroller$Action;->(II)V PLandroidx/recyclerview/widget/RecyclerView$ViewHolder;->()V PLandroidx/recyclerview/widget/RecyclerView$ViewHolder;->addChangePayload(Ljava/lang/Object;)V PLandroidx/recyclerview/widget/RecyclerView$ViewHolder;->clearOldPosition()V PLandroidx/recyclerview/widget/RecyclerView$ViewHolder;->setIsRecyclable(Z)V PLandroidx/recyclerview/widget/RecyclerView;->()V PLandroidx/recyclerview/widget/RecyclerView;->(Landroid/content/Context;Landroid/util/AttributeSet;)V PLandroidx/recyclerview/widget/RecyclerView;->addAnimatingView(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;)V PLandroidx/recyclerview/widget/RecyclerView;->addItemDecoration(Landroidx/recyclerview/widget/RecyclerView$ItemDecoration;)V PLandroidx/recyclerview/widget/RecyclerView;->addOnScrollListener(Landroidx/recyclerview/widget/RecyclerView$OnScrollListener;)V PLandroidx/recyclerview/widget/RecyclerView;->computeHorizontalScrollExtent()I PLandroidx/recyclerview/widget/RecyclerView;->computeHorizontalScrollOffset()I PLandroidx/recyclerview/widget/RecyclerView;->computeHorizontalScrollRange()I PLandroidx/recyclerview/widget/RecyclerView;->dispatchNestedFling(FFZ)Z PLandroidx/recyclerview/widget/RecyclerView;->dispatchNestedPreFling(FF)Z PLandroidx/recyclerview/widget/RecyclerView;->dispatchSaveInstanceState(Landroid/util/SparseArray;)V PLandroidx/recyclerview/widget/RecyclerView;->findInterceptingOnItemTouchListener(Landroid/view/MotionEvent;)Z PLandroidx/recyclerview/widget/RecyclerView;->getAdapter()Landroidx/recyclerview/widget/RecyclerView$Adapter; PLandroidx/recyclerview/widget/RecyclerView;->getChangedHolderKey(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;)J PLandroidx/recyclerview/widget/RecyclerView;->getItemAnimator()Landroidx/recyclerview/widget/RecyclerView$ItemAnimator; PLandroidx/recyclerview/widget/RecyclerView;->getItemDecorationCount()I PLandroidx/recyclerview/widget/RecyclerView;->invalidateGlows()V PLandroidx/recyclerview/widget/RecyclerView;->isLayoutSuppressed()Z PLandroidx/recyclerview/widget/RecyclerView;->isNestedScrollingEnabled()Z PLandroidx/recyclerview/widget/RecyclerView;->onSaveInstanceState()Landroid/os/Parcelable; PLandroidx/recyclerview/widget/RecyclerView;->onSizeChanged(IIII)V PLandroidx/recyclerview/widget/RecyclerView;->postAnimationRunner()V PLandroidx/recyclerview/widget/RecyclerView;->removeItemDecoration(Landroidx/recyclerview/widget/RecyclerView$ItemDecoration;)V PLandroidx/recyclerview/widget/RecyclerView;->resetScroll()V PLandroidx/recyclerview/widget/RecyclerView;->scrollByInternal(IILandroid/view/MotionEvent;)Z PLandroidx/recyclerview/widget/RecyclerView;->setAccessibilityDelegateCompat(Landroidx/recyclerview/widget/RecyclerViewAccessibilityDelegate;)V PLandroidx/recyclerview/widget/RecyclerView;->setChildImportantForAccessibilityInternal(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;I)Z PLandroidx/recyclerview/widget/RecyclerView;->setClipToPadding(Z)V PLandroidx/recyclerview/widget/RecyclerView;->setLayoutFrozen(Z)V PLandroidx/recyclerview/widget/RecyclerView;->setNestedScrollingEnabled(Z)V PLandroidx/recyclerview/widget/RecyclerView;->setRecycledViewPool(Landroidx/recyclerview/widget/RecyclerView$RecycledViewPool;)V PLandroidx/recyclerview/widget/RecyclerView;->startNestedScroll(II)Z PLandroidx/recyclerview/widget/RecyclerView;->stopNestedScroll(I)V PLandroidx/recyclerview/widget/RecyclerView;->suppressLayout(Z)V PLandroidx/recyclerview/widget/RecyclerViewAccessibilityDelegate$ItemDelegate;->(Landroidx/recyclerview/widget/RecyclerViewAccessibilityDelegate;)V PLandroidx/recyclerview/widget/RecyclerViewAccessibilityDelegate$ItemDelegate;->onRequestSendAccessibilityEvent(Landroid/view/ViewGroup;Landroid/view/View;Landroid/view/accessibility/AccessibilityEvent;)Z PLandroidx/recyclerview/widget/RecyclerViewAccessibilityDelegate;->(Landroidx/recyclerview/widget/RecyclerView;)V PLandroidx/recyclerview/widget/ViewBoundsCheck$BoundFlags;->()V PLandroidx/recyclerview/widget/ViewInfoStore$InfoRecord;->()V PLandroidx/recyclerview/widget/ViewInfoStore$InfoRecord;->()V PLandroidx/recyclerview/widget/ViewInfoStore$InfoRecord;->obtain()Landroidx/recyclerview/widget/ViewInfoStore$InfoRecord; PLandroidx/recyclerview/widget/ViewInfoStore$InfoRecord;->recycle(Landroidx/recyclerview/widget/ViewInfoStore$InfoRecord;)V PLandroidx/recyclerview/widget/ViewInfoStore;->(Landroidx/recyclerview/widget/ViewBoundsCheck$Callback;)V PLandroidx/recyclerview/widget/ViewInfoStore;->addToPostLayout(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;Lcom/google/android/material/internal/ViewUtils$RelativePadding;)V PLandroidx/recyclerview/widget/ViewInfoStore;->addToPreLayout(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;Lcom/google/android/material/internal/ViewUtils$RelativePadding;)V PLandroidx/recyclerview/widget/ViewInfoStore;->isDisappearing(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;)Z PLandroidx/recyclerview/widget/ViewInfoStore;->popFromLayoutStep(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;I)Lcom/google/android/material/internal/ViewUtils$RelativePadding; PLandroidx/room/DatabaseConfiguration;->(Landroid/content/Context;Ljava/lang/String;Landroidx/sqlite/db/SupportSQLiteOpenHelper$Factory;Landroidx/transition/ViewUtilsBase;Ljava/util/List;ZILjava/util/concurrent/Executor;Ljava/util/concurrent/Executor;Landroid/content/Intent;ZZLjava/util/Set;Ljava/lang/String;Ljava/io/File;Ljava/util/concurrent/Callable;Ljava/util/List;Ljava/util/List;)V PLandroidx/room/EntityInsertionAdapter;->(Landroidx/room/RoomDatabase;)V PLandroidx/room/EntityInsertionAdapter;->createNewStatement()Landroidx/sqlite/db/SupportSQLiteStatement; PLandroidx/room/EntityInsertionAdapter;->getStmt(Z)Landroidx/sqlite/db/SupportSQLiteStatement; PLandroidx/room/EntityInsertionAdapter;->insert(Ljava/lang/Iterable;)V PLandroidx/room/InvalidationTracker$$ExternalSyntheticLambda0;->(Ljava/lang/Object;I)V PLandroidx/room/InvalidationTracker$$ExternalSyntheticLambda0;->run()V PLandroidx/room/InvalidationTracker;->()V PLandroidx/room/InvalidationTracker;->(Landroidx/room/RoomDatabase;Ljava/util/Map;Ljava/util/Map;[Ljava/lang/String;)V PLandroidx/room/InvalidationTracker;->ensureInitialization()Z PLandroidx/room/InvalidationTracker;->syncTriggers(Landroidx/sqlite/db/SupportSQLiteDatabase;)V PLandroidx/room/QueryInterceptorProgram;->(Landroid/database/sqlite/SQLiteProgram;)V PLandroidx/room/Room$$ExternalSyntheticOutline0;->getMValue(I)J PLandroidx/room/Room$$ExternalSyntheticOutline0;->m(ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/StringBuilder; PLandroidx/room/Room$$ExternalSyntheticOutline0;->m(ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V PLandroidx/room/Room;->()V PLandroidx/room/Room;->booleanKey(Ljava/lang/String;)Landroidx/datastore/preferences/core/Preferences$Key; PLandroidx/room/Room;->checkArgument(ZLjava/lang/String;)V PLandroidx/room/Room;->checkNotNull(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLandroidx/room/Room;->checkPermission(Landroid/content/Context;Ljava/lang/String;IILjava/lang/String;)I PLandroidx/room/Room;->checkPositionIndex(II)I PLandroidx/room/Room;->checkSelfPermission(Landroid/content/Context;Ljava/lang/String;)I PLandroidx/room/Room;->clamp(III)I PLandroidx/room/Room;->fromApplication(Landroid/content/Context;Ljava/lang/Class;)Ljava/lang/Object; PLandroidx/room/Room;->getParentActivityName(Landroid/content/Context;Landroid/content/ComponentName;)Ljava/lang/String; PLandroidx/room/Room;->isAtLeastO()Z PLandroidx/room/Room;->isEnabled()Z PLandroidx/room/Room;->repeatOnLifecycle(Landroidx/lifecycle/Lifecycle;Landroidx/lifecycle/Lifecycle$State;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLandroidx/room/Room;->setDecorFitsSystemWindows(Landroid/view/Window;Z)V PLandroidx/room/Room;->setupWithNavController(Lcom/google/android/material/navigation/NavigationBarView;Landroidx/navigation/NavHostController;)V PLandroidx/room/Room;->stringKey(Ljava/lang/String;)Landroidx/datastore/preferences/core/Preferences$Key; PLandroidx/room/Room;->threadSafe(ILcom/bumptech/glide/util/pool/FactoryPools$Factory;)Landroidx/core/util/Pools$Pool; PLandroidx/room/Room;->toByteArrayList([Ljava/lang/String;)Ljava/util/List; PLandroidx/room/Room;->writeBundle(Landroid/os/Parcel;ILandroid/os/Bundle;Z)V PLandroidx/room/Room;->writeLongObject(Landroid/os/Parcel;ILjava/lang/Long;Z)V PLandroidx/room/Room;->writeParcelable(Landroid/os/Parcel;ILandroid/os/Parcelable;IZ)V PLandroidx/room/Room;->writeString(Landroid/os/Parcel;ILjava/lang/String;Z)V PLandroidx/room/Room;->zza(Landroid/os/Parcel;I)I PLandroidx/room/Room;->zzb(Landroid/os/Parcel;I)V PLandroidx/room/Room;->zzb(Landroid/os/Parcel;II)V PLandroidx/room/RoomDatabase;->()V PLandroidx/room/RoomDatabase;->assertNotMainThread()V PLandroidx/room/RoomDatabase;->assertNotSuspendingTransaction()V PLandroidx/room/RoomDatabase;->inTransaction()Z PLandroidx/room/RoomDatabase;->internalBeginTransaction()V PLandroidx/room/RoomDatabase;->internalEndTransaction()V PLandroidx/room/RoomDatabase;->isOpen()Z PLandroidx/room/RoomDatabase;->query(Landroidx/sqlite/db/SupportSQLiteQuery;Landroid/os/CancellationSignal;)Landroid/database/Cursor; PLandroidx/room/RoomDatabase;->setTransactionSuccessful()V PLandroidx/room/RoomDatabase;->unwrapOpenHelper(Ljava/lang/Class;Landroidx/sqlite/db/SupportSQLiteOpenHelper;)Ljava/lang/Object; PLandroidx/room/RoomOpenHelper;->(Landroidx/room/DatabaseConfiguration;Lcom/google/samples/apps/iosched/shared/data/db/AppDatabase_Impl$1;Ljava/lang/String;Ljava/lang/String;)V PLandroidx/room/RoomOpenHelper;->onConfigure(Landroidx/sqlite/db/SupportSQLiteDatabase;)V PLandroidx/room/RoomOpenHelper;->onOpen(Landroidx/sqlite/db/SupportSQLiteDatabase;)V PLandroidx/savedstate/Recreator;->(Landroidx/savedstate/SavedStateRegistryOwner;)V PLandroidx/savedstate/SavedStateRegistry$1;->(Landroidx/savedstate/SavedStateRegistry;)V PLandroidx/savedstate/SavedStateRegistry;->consumeRestoredStateForKey(Ljava/lang/String;)Landroid/os/Bundle; PLandroidx/savedstate/SavedStateRegistry;->registerSavedStateProvider(Ljava/lang/String;Landroidx/savedstate/SavedStateRegistry$SavedStateProvider;)V PLandroidx/savedstate/SavedStateRegistry;->runOnNextRecreation(Ljava/lang/Class;)V PLandroidx/savedstate/SavedStateRegistryController;->(Landroidx/savedstate/SavedStateRegistryOwner;)V PLandroidx/savedstate/SavedStateRegistryController;->performSave(Landroid/os/Bundle;)V PLandroidx/slidingpanelayout/widget/FoldingFeatureObserver$registerLayoutStateChangeCallback$1$invokeSuspend$$inlined$collect$1;->(Landroidx/slidingpanelayout/widget/FoldingFeatureObserver;)V PLandroidx/slidingpanelayout/widget/FoldingFeatureObserver$registerLayoutStateChangeCallback$1$invokeSuspend$$inlined$mapNotNull$1$2$1;->(Lkotlinx/coroutines/flow/StartedLazily$command$1$1;Lkotlin/coroutines/Continuation;)V PLandroidx/slidingpanelayout/widget/FoldingFeatureObserver$registerLayoutStateChangeCallback$1;->(Landroidx/slidingpanelayout/widget/FoldingFeatureObserver;Landroid/app/Activity;Lkotlin/coroutines/Continuation;)V PLandroidx/slidingpanelayout/widget/FoldingFeatureObserver$registerLayoutStateChangeCallback$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; PLandroidx/slidingpanelayout/widget/FoldingFeatureObserver$registerLayoutStateChangeCallback$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLandroidx/slidingpanelayout/widget/FoldingFeatureObserver;->(Landroidx/window/layout/WindowInfoTracker;Ljava/util/concurrent/Executor;)V PLandroidx/slidingpanelayout/widget/SlidingPaneLayout$1;->(Landroidx/slidingpanelayout/widget/SlidingPaneLayout;)V PLandroidx/slidingpanelayout/widget/SlidingPaneLayout$DragHelperCallback;->(Ljava/lang/Object;I)V PLandroidx/slidingpanelayout/widget/SlidingPaneLayout$DragHelperCallback;->getViewHorizontalDragRange(Landroid/view/View;)I PLandroidx/slidingpanelayout/widget/SlidingPaneLayout$DragHelperCallback;->getViewVerticalDragRange(Landroid/view/View;)I PLandroidx/slidingpanelayout/widget/SlidingPaneLayout$LayoutParams;->()V PLandroidx/slidingpanelayout/widget/SlidingPaneLayout$LayoutParams;->(Landroid/content/Context;Landroid/util/AttributeSet;)V PLandroidx/slidingpanelayout/widget/SlidingPaneLayout$SavedState;->()V PLandroidx/slidingpanelayout/widget/SlidingPaneLayout$SavedState;->(Landroid/os/Parcelable;)V PLandroidx/slidingpanelayout/widget/SlidingPaneLayout$SavedState;->writeToParcel(Landroid/os/Parcel;I)V PLandroidx/slidingpanelayout/widget/SlidingPaneLayout$TouchBlocker;->(Landroid/view/View;)V PLandroidx/slidingpanelayout/widget/SlidingPaneLayout;->()V PLandroidx/slidingpanelayout/widget/SlidingPaneLayout;->(Landroid/content/Context;Landroid/util/AttributeSet;I)V PLandroidx/slidingpanelayout/widget/SlidingPaneLayout;->addView(Landroid/view/View;ILandroid/view/ViewGroup$LayoutParams;)V PLandroidx/slidingpanelayout/widget/SlidingPaneLayout;->checkLayoutParams(Landroid/view/ViewGroup$LayoutParams;)Z PLandroidx/slidingpanelayout/widget/SlidingPaneLayout;->computeScroll()V PLandroidx/slidingpanelayout/widget/SlidingPaneLayout;->generateLayoutParams(Landroid/util/AttributeSet;)Landroid/view/ViewGroup$LayoutParams; PLandroidx/slidingpanelayout/widget/SlidingPaneLayout;->isOpen()Z PLandroidx/slidingpanelayout/widget/SlidingPaneLayout;->onAttachedToWindow()V PLandroidx/slidingpanelayout/widget/SlidingPaneLayout;->onDetachedFromWindow()V PLandroidx/slidingpanelayout/widget/SlidingPaneLayout;->onSaveInstanceState()Landroid/os/Parcelable; PLandroidx/slidingpanelayout/widget/SlidingPaneLayout;->onSizeChanged(IIII)V PLandroidx/slidingpanelayout/widget/SlidingPaneLayout;->setFoldingFeatureObserver(Landroidx/slidingpanelayout/widget/FoldingFeatureObserver;)V PLandroidx/slidingpanelayout/widget/SlidingPaneLayout;->setLockMode(I)V PLandroidx/slidingpanelayout/widget/SlidingPaneLayout;->updateObscuredViewsVisibility(Landroid/view/View;)V PLandroidx/sqlite/db/SupportSQLiteOpenHelper$Callback;->(I)V PLandroidx/sqlite/db/SupportSQLiteOpenHelper$Configuration;->(Landroid/content/Context;Ljava/lang/String;Landroidx/sqlite/db/SupportSQLiteOpenHelper$Callback;Z)V PLandroidx/sqlite/db/framework/FrameworkSQLiteDatabase$1;->(Landroidx/sqlite/db/framework/FrameworkSQLiteDatabase;Landroidx/sqlite/db/SupportSQLiteQuery;I)V PLandroidx/sqlite/db/framework/FrameworkSQLiteDatabase$1;->newCursor(Landroid/database/sqlite/SQLiteDatabase;Landroid/database/sqlite/SQLiteCursorDriver;Ljava/lang/String;Landroid/database/sqlite/SQLiteQuery;)Landroid/database/Cursor; PLandroidx/sqlite/db/framework/FrameworkSQLiteDatabase;->()V PLandroidx/sqlite/db/framework/FrameworkSQLiteDatabase;->(Landroid/database/sqlite/SQLiteDatabase;)V PLandroidx/sqlite/db/framework/FrameworkSQLiteDatabase;->beginTransactionNonExclusive()V PLandroidx/sqlite/db/framework/FrameworkSQLiteDatabase;->compileStatement(Ljava/lang/String;)Landroidx/sqlite/db/SupportSQLiteStatement; PLandroidx/sqlite/db/framework/FrameworkSQLiteDatabase;->endTransaction()V PLandroidx/sqlite/db/framework/FrameworkSQLiteDatabase;->inTransaction()Z PLandroidx/sqlite/db/framework/FrameworkSQLiteDatabase;->isOpen()Z PLandroidx/sqlite/db/framework/FrameworkSQLiteDatabase;->isWriteAheadLoggingEnabled()Z PLandroidx/sqlite/db/framework/FrameworkSQLiteDatabase;->query(Landroidx/sqlite/db/SupportSQLiteQuery;)Landroid/database/Cursor; PLandroidx/sqlite/db/framework/FrameworkSQLiteDatabase;->query(Ljava/lang/String;)Landroid/database/Cursor; PLandroidx/sqlite/db/framework/FrameworkSQLiteDatabase;->setTransactionSuccessful()V PLandroidx/sqlite/db/framework/FrameworkSQLiteOpenHelper$OpenHelper$1;->(Landroidx/sqlite/db/SupportSQLiteOpenHelper$Callback;[Landroidx/sqlite/db/framework/FrameworkSQLiteDatabase;)V PLandroidx/sqlite/db/framework/FrameworkSQLiteOpenHelper$OpenHelper;->(Landroid/content/Context;Ljava/lang/String;[Landroidx/sqlite/db/framework/FrameworkSQLiteDatabase;Landroidx/sqlite/db/SupportSQLiteOpenHelper$Callback;)V PLandroidx/sqlite/db/framework/FrameworkSQLiteOpenHelper$OpenHelper;->getWrappedDb(Landroid/database/sqlite/SQLiteDatabase;)Landroidx/sqlite/db/framework/FrameworkSQLiteDatabase; PLandroidx/sqlite/db/framework/FrameworkSQLiteOpenHelper$OpenHelper;->getWrappedDb([Landroidx/sqlite/db/framework/FrameworkSQLiteDatabase;Landroid/database/sqlite/SQLiteDatabase;)Landroidx/sqlite/db/framework/FrameworkSQLiteDatabase; PLandroidx/sqlite/db/framework/FrameworkSQLiteOpenHelper$OpenHelper;->getWritableSupportDatabase()Landroidx/sqlite/db/SupportSQLiteDatabase; PLandroidx/sqlite/db/framework/FrameworkSQLiteOpenHelper$OpenHelper;->onConfigure(Landroid/database/sqlite/SQLiteDatabase;)V PLandroidx/sqlite/db/framework/FrameworkSQLiteOpenHelper$OpenHelper;->onOpen(Landroid/database/sqlite/SQLiteDatabase;)V PLandroidx/sqlite/db/framework/FrameworkSQLiteOpenHelper;->(Landroid/content/Context;Ljava/lang/String;Landroidx/sqlite/db/SupportSQLiteOpenHelper$Callback;Z)V PLandroidx/sqlite/db/framework/FrameworkSQLiteOpenHelper;->getDelegate()Landroidx/sqlite/db/framework/FrameworkSQLiteOpenHelper$OpenHelper; PLandroidx/sqlite/db/framework/FrameworkSQLiteOpenHelper;->getWritableDatabase()Landroidx/sqlite/db/SupportSQLiteDatabase; PLandroidx/sqlite/db/framework/FrameworkSQLiteOpenHelper;->setWriteAheadLoggingEnabled(Z)V PLandroidx/sqlite/db/framework/FrameworkSQLiteStatement;->(Landroid/database/sqlite/SQLiteStatement;)V PLandroidx/sqlite/db/framework/FrameworkSQLiteStatement;->executeInsert()J PLandroidx/startup/AppInitializer;->()V PLandroidx/startup/AppInitializer;->(Landroid/content/Context;)V PLandroidx/startup/AppInitializer;->doInitialize(Ljava/lang/Class;Ljava/util/Set;)Ljava/lang/Object; PLandroidx/startup/InitializationProvider;->()V PLandroidx/startup/InitializationProvider;->onCreate()Z PLandroidx/swiperefreshlayout/widget/CircleImageView;->(Landroid/content/Context;I)V PLandroidx/swiperefreshlayout/widget/CircleImageView;->onMeasure(II)V PLandroidx/swiperefreshlayout/widget/CircularProgressDrawable$2;->(Landroidx/swiperefreshlayout/widget/CircularProgressDrawable;Landroidx/swiperefreshlayout/widget/CircularProgressDrawable$Ring;)V PLandroidx/swiperefreshlayout/widget/CircularProgressDrawable$Ring;->()V PLandroidx/swiperefreshlayout/widget/CircularProgressDrawable$Ring;->setColorIndex(I)V PLandroidx/swiperefreshlayout/widget/CircularProgressDrawable$Ring;->setShowArrow(Z)V PLandroidx/swiperefreshlayout/widget/CircularProgressDrawable;->()V PLandroidx/swiperefreshlayout/widget/CircularProgressDrawable;->(Landroid/content/Context;)V PLandroidx/swiperefreshlayout/widget/CircularProgressDrawable;->getOpacity()I PLandroidx/swiperefreshlayout/widget/CircularProgressDrawable;->setSizeParameters(FFFF)V PLandroidx/swiperefreshlayout/widget/CircularProgressDrawable;->setStyle(I)V PLandroidx/swiperefreshlayout/widget/CircularProgressDrawable;->stop()V PLandroidx/swiperefreshlayout/widget/SwipeRefreshLayout$1;->(Landroidx/swiperefreshlayout/widget/SwipeRefreshLayout;I)V PLandroidx/swiperefreshlayout/widget/SwipeRefreshLayout$2;->(Landroidx/swiperefreshlayout/widget/SwipeRefreshLayout;I)V PLandroidx/swiperefreshlayout/widget/SwipeRefreshLayout;->()V PLandroidx/swiperefreshlayout/widget/SwipeRefreshLayout;->(Landroid/content/Context;Landroid/util/AttributeSet;)V PLandroidx/swiperefreshlayout/widget/SwipeRefreshLayout;->canChildScrollUp()Z PLandroidx/swiperefreshlayout/widget/SwipeRefreshLayout;->dispatchNestedFling(FFZ)Z PLandroidx/swiperefreshlayout/widget/SwipeRefreshLayout;->dispatchNestedPreFling(FF)Z PLandroidx/swiperefreshlayout/widget/SwipeRefreshLayout;->dispatchNestedPreScroll(II[I[I)Z PLandroidx/swiperefreshlayout/widget/SwipeRefreshLayout;->dispatchNestedScroll(IIII[I)Z PLandroidx/swiperefreshlayout/widget/SwipeRefreshLayout;->ensureTarget()V PLandroidx/swiperefreshlayout/widget/SwipeRefreshLayout;->getChildDrawingOrder(II)I PLandroidx/swiperefreshlayout/widget/SwipeRefreshLayout;->moveToStart(F)V PLandroidx/swiperefreshlayout/widget/SwipeRefreshLayout;->onDetachedFromWindow()V PLandroidx/swiperefreshlayout/widget/SwipeRefreshLayout;->onInterceptTouchEvent(Landroid/view/MotionEvent;)Z PLandroidx/swiperefreshlayout/widget/SwipeRefreshLayout;->onLayout(ZIIII)V PLandroidx/swiperefreshlayout/widget/SwipeRefreshLayout;->onNestedFling(Landroid/view/View;FFZ)Z PLandroidx/swiperefreshlayout/widget/SwipeRefreshLayout;->onNestedPreFling(Landroid/view/View;FF)Z PLandroidx/swiperefreshlayout/widget/SwipeRefreshLayout;->onNestedPreScroll(Landroid/view/View;II[I)V PLandroidx/swiperefreshlayout/widget/SwipeRefreshLayout;->onNestedScroll(Landroid/view/View;IIII)V PLandroidx/swiperefreshlayout/widget/SwipeRefreshLayout;->onNestedScrollAccepted(Landroid/view/View;Landroid/view/View;I)V PLandroidx/swiperefreshlayout/widget/SwipeRefreshLayout;->onStartNestedScroll(Landroid/view/View;Landroid/view/View;I)Z PLandroidx/swiperefreshlayout/widget/SwipeRefreshLayout;->onStopNestedScroll(Landroid/view/View;)V PLandroidx/swiperefreshlayout/widget/SwipeRefreshLayout;->requestDisallowInterceptTouchEvent(Z)V PLandroidx/swiperefreshlayout/widget/SwipeRefreshLayout;->reset()V PLandroidx/swiperefreshlayout/widget/SwipeRefreshLayout;->setColorSchemeColors([I)V PLandroidx/swiperefreshlayout/widget/SwipeRefreshLayout;->setColorViewAlpha(I)V PLandroidx/swiperefreshlayout/widget/SwipeRefreshLayout;->setEnabled(Z)V PLandroidx/swiperefreshlayout/widget/SwipeRefreshLayout;->setNestedScrollingEnabled(Z)V PLandroidx/swiperefreshlayout/widget/SwipeRefreshLayout;->setOnRefreshListener(Landroidx/swiperefreshlayout/widget/SwipeRefreshLayout$OnRefreshListener;)V PLandroidx/swiperefreshlayout/widget/SwipeRefreshLayout;->setRefreshing(Z)V PLandroidx/swiperefreshlayout/widget/SwipeRefreshLayout;->setRefreshing(ZZ)V PLandroidx/swiperefreshlayout/widget/SwipeRefreshLayout;->setTargetOffsetTopAndBottom(I)V PLandroidx/swiperefreshlayout/widget/SwipeRefreshLayout;->startNestedScroll(I)Z PLandroidx/swiperefreshlayout/widget/SwipeRefreshLayout;->stopNestedScroll()V PLandroidx/transition/AutoTransition;->()V PLandroidx/transition/AutoTransition;->init()V PLandroidx/transition/ChangeBounds$1;->(Ljava/lang/Class;Ljava/lang/String;)V PLandroidx/transition/ChangeBounds;->()V PLandroidx/transition/ChangeBounds;->()V PLandroidx/transition/Fade;->(I)V PLandroidx/transition/GhostViewPort$1;->(Ljava/lang/Object;I)V PLandroidx/transition/PathMotion;->()V PLandroidx/transition/RectEvaluator;->(I)V PLandroidx/transition/Styleable;->()V PLandroidx/transition/Styleable;->Mutex$default(ZI)Lkotlinx/coroutines/sync/Mutex; PLandroidx/transition/Styleable;->getPackageCertificateHashBytes(Landroid/content/Context;Ljava/lang/String;)[B PLandroidx/transition/Styleable;->toArray(Ljava/util/Collection;)[Ljava/lang/Object; PLandroidx/transition/Styleable;->zzj(Ljava/lang/String;)Ljava/security/MessageDigest; PLandroidx/transition/Transition$1;->()V PLandroidx/transition/Transition;->()V PLandroidx/transition/Transition;->setDuration(J)Landroidx/transition/Transition; PLandroidx/transition/Transition;->setInterpolator(Landroid/animation/TimeInterpolator;)Landroidx/transition/Transition; PLandroidx/transition/TransitionManager;->()V PLandroidx/transition/TransitionManager;->beginDelayedTransition(Landroid/view/ViewGroup;Landroidx/transition/Transition;)V PLandroidx/transition/TransitionSet;->()V PLandroidx/transition/TransitionSet;->addTransition(Landroidx/transition/Transition;)Landroidx/transition/TransitionSet; PLandroidx/transition/TransitionSet;->setDuration(J)Landroidx/transition/TransitionSet; PLandroidx/transition/TransitionSet;->setInterpolator(Landroid/animation/TimeInterpolator;)Landroidx/transition/TransitionSet; PLandroidx/transition/TransitionSet;->setOrdering(I)Landroidx/transition/TransitionSet; PLandroidx/transition/ViewOverlayApi14;->()V PLandroidx/transition/ViewOverlayApi14;->(Lcom/google/android/gms/measurement/internal/zzfw;)V PLandroidx/transition/ViewOverlayApi14;->(Ljava/lang/Object;I)V PLandroidx/transition/ViewOverlayApi14;->get()Lcom/bumptech/glide/load/engine/bitmap_recycle/Poolable; PLandroidx/transition/ViewOverlayApi14;->offer(Lcom/bumptech/glide/load/engine/bitmap_recycle/Poolable;)V PLandroidx/transition/ViewOverlayApi14;->zzb()V PLandroidx/transition/ViewOverlayApi14;->zzl()Lcom/google/android/gms/measurement/internal/zzai; PLandroidx/transition/ViewOverlayApi14;->zzm()Lcom/google/android/gms/common/util/Clock; PLandroidx/transition/ViewOverlayApi14;->zzp()Lcom/google/android/gms/measurement/internal/zzkm; PLandroidx/transition/ViewOverlayApi14;->zzq()Lcom/google/android/gms/measurement/internal/zzft; PLandroidx/transition/ViewOverlayApi14;->zzs()Lcom/google/android/gms/measurement/internal/zzfe; PLandroidx/transition/ViewOverlayApi18;->(I)V PLandroidx/transition/ViewOverlayApi18;->(Landroid/content/Context;)V PLandroidx/transition/ViewOverlayApi18;->(Ljava/lang/Object;I)V PLandroidx/transition/ViewOverlayApi18;->build(Landroid/net/Uri;)Lcom/bumptech/glide/load/data/DataFetcher; PLandroidx/transition/ViewOverlayApi18;->build(Lcom/bumptech/glide/load/model/MultiModelLoaderFactory;)Lcom/bumptech/glide/load/model/ModelLoader; PLandroidx/transition/ViewOverlayApi18;->create()Ljava/lang/Object; PLandroidx/transition/ViewOverlayApi18;->getBoolean(Ljava/lang/String;)Z PLandroidx/transition/ViewOverlayApi18;->put(Ljava/lang/Class;Ljava/util/List;)V PLandroidx/transition/ViewOverlayApi18;->zza()V PLandroidx/transition/ViewOverlayApi18;->zza(JZ)V PLandroidx/transition/ViewOverlayApi18;->zza(Landroid/content/Context;)Z PLandroidx/transition/ViewOverlayApi18;->zzd()Z PLandroidx/transition/ViewUtils$1;->(Ljava/lang/Class;Ljava/lang/String;I)V PLandroidx/transition/ViewUtilsBase;->(I)V PLandroidx/transition/ViewUtilsBase;->(Ljava/io/InputStream;Lcom/bumptech/glide/load/engine/bitmap_recycle/LruArrayPool;)V PLandroidx/transition/ViewUtilsBase;->(Ljava/lang/Object;I)V PLandroidx/transition/ViewUtilsBase;->build(Landroid/net/Uri;)Lcom/bumptech/glide/load/data/DataFetcher; PLandroidx/transition/ViewUtilsBase;->build(Lcom/bumptech/glide/load/model/MultiModelLoaderFactory;)Lcom/bumptech/glide/load/model/ModelLoader; PLandroidx/transition/ViewUtilsBase;->cleanup()V PLandroidx/transition/ViewUtilsBase;->execute()Ljava/lang/Object; PLandroidx/transition/ViewUtilsBase;->rewindAndGet()Ljava/lang/Object; PLandroidx/transition/Visibility;->()V PLandroidx/transition/Visibility;->()V PLandroidx/transition/Visibility;->setMode(I)V PLandroidx/viewpager/widget/ViewPager$2;->(I)V PLandroidx/viewpager/widget/ViewPager$MyAccessibilityDelegate;->(Landroid/view/View;I)V PLandroidx/window/core/Version;->()V PLandroidx/window/core/Version;->(IIILjava/lang/String;)V PLandroidx/window/core/Version;->compareTo(Landroidx/window/core/Version;)I PLandroidx/window/layout/SafeWindowLayoutComponentProvider$isFoldingFeatureValid$1;->(Ljava/lang/ClassLoader;I)V PLandroidx/window/layout/SafeWindowLayoutComponentProvider$isFoldingFeatureValid$1;->invoke()Ljava/lang/Boolean; PLandroidx/window/layout/SafeWindowLayoutComponentProvider$isFoldingFeatureValid$1;->invoke()Ljava/lang/Object; PLandroidx/window/layout/SafeWindowLayoutComponentProvider;->()V PLandroidx/window/layout/SafeWindowLayoutComponentProvider;->()V PLandroidx/window/layout/SafeWindowLayoutComponentProvider;->getWindowLayoutComponent()Landroidx/window/extensions/layout/WindowLayoutComponent; PLandroidx/window/layout/SafeWindowLayoutComponentProvider;->validate(Lkotlin/jvm/functions/Function0;)Z PLandroidx/window/layout/SidecarAdapter;->()V PLandroidx/window/layout/SidecarAdapter;->(II)V PLandroidx/window/layout/SidecarAdapter;->translate(Landroidx/window/sidecar/SidecarWindowLayoutInfo;Landroidx/window/sidecar/SidecarDeviceState;)Landroidx/window/layout/WindowLayoutInfo; PLandroidx/window/layout/SidecarAdapter;->translate(Ljava/util/List;Landroidx/window/sidecar/SidecarDeviceState;)Ljava/util/List; PLandroidx/window/layout/SidecarCompat$Companion;->(I)V PLandroidx/window/layout/SidecarCompat$Companion;->(Lkotlin/LazyKt__LazyKt;I)V PLandroidx/window/layout/SidecarCompat$Companion;->build(Lcom/bumptech/glide/load/model/MultiModelLoaderFactory;)Lcom/bumptech/glide/load/model/ModelLoader; PLandroidx/window/layout/SidecarCompat$Companion;->create()Ljava/lang/Object; PLandroidx/window/layout/SidecarCompat$Companion;->getActivityWindowToken$window_release(Landroid/app/Activity;)Landroid/os/IBinder; PLandroidx/window/layout/SidecarCompat$Companion;->getRawSidecarDevicePosture(Landroidx/window/sidecar/SidecarDeviceState;)I PLandroidx/window/layout/SidecarCompat$Companion;->getSidecarCompat$window_release(Landroid/content/Context;)Landroidx/window/sidecar/SidecarInterface; PLandroidx/window/layout/SidecarCompat$Companion;->getSidecarDisplayFeatures(Landroidx/window/sidecar/SidecarWindowLayoutInfo;)Ljava/util/List; PLandroidx/window/layout/SidecarCompat$Companion;->getSidecarVersion()Landroidx/window/core/Version; PLandroidx/window/layout/SidecarCompat$Companion;->setSidecarDevicePosture(Landroidx/window/sidecar/SidecarDeviceState;I)V PLandroidx/window/layout/SidecarCompat$DistinctElementCallback;->(Landroidx/window/layout/ExtensionInterfaceCompat$ExtensionCallbackInterface;)V PLandroidx/window/layout/SidecarCompat$DistinctElementCallback;->onWindowLayoutChanged(Landroid/app/Activity;Landroidx/window/layout/WindowLayoutInfo;)V PLandroidx/window/layout/SidecarCompat$DistinctSidecarElementCallback;->(Landroidx/window/layout/SidecarAdapter;Landroidx/window/sidecar/SidecarInterface$SidecarCallback;)V PLandroidx/window/layout/SidecarCompat$TranslatingCallback;->(Landroidx/window/layout/SidecarCompat;)V PLandroidx/window/layout/SidecarCompat$registerConfigurationChangeListener$configChangeObserver$1;->(Landroidx/window/layout/SidecarCompat;Landroid/app/Activity;)V PLandroidx/window/layout/SidecarCompat;->()V PLandroidx/window/layout/SidecarCompat;->(Landroid/content/Context;)V PLandroidx/window/layout/SidecarCompat;->getWindowLayoutInfo(Landroid/app/Activity;)Landroidx/window/layout/WindowLayoutInfo; PLandroidx/window/layout/SidecarCompat;->onWindowLayoutChangeListenerRemoved(Landroid/app/Activity;)V PLandroidx/window/layout/SidecarCompat;->register(Landroid/os/IBinder;Landroid/app/Activity;)V PLandroidx/window/layout/SidecarCompat;->setExtensionCallback(Landroidx/window/layout/ExtensionInterfaceCompat$ExtensionCallbackInterface;)V PLandroidx/window/layout/SidecarCompat;->validateExtensionInterface()Z PLandroidx/window/layout/SidecarWindowBackend$ExtensionListenerImpl;->(Landroidx/window/layout/SidecarWindowBackend;)V PLandroidx/window/layout/SidecarWindowBackend$ExtensionListenerImpl;->onWindowLayoutChanged(Landroid/app/Activity;Landroidx/window/layout/WindowLayoutInfo;)V PLandroidx/window/layout/SidecarWindowBackend$WindowLayoutChangeCallbackWrapper;->(Landroid/app/Activity;Ljava/util/concurrent/Executor;Landroidx/core/util/Consumer;)V PLandroidx/window/layout/SidecarWindowBackend;->()V PLandroidx/window/layout/SidecarWindowBackend;->(Landroidx/window/layout/ExtensionInterfaceCompat;)V PLandroidx/window/layout/SidecarWindowBackend;->registerLayoutChangeCallback(Landroid/app/Activity;Ljava/util/concurrent/Executor;Landroidx/core/util/Consumer;)V PLandroidx/window/layout/SidecarWindowBackend;->unregisterLayoutChangeCallback(Landroidx/core/util/Consumer;)V PLandroidx/window/layout/WindowInfoTracker$Companion;->()V PLandroidx/window/layout/WindowInfoTracker$Companion;->()V PLandroidx/window/layout/WindowInfoTracker;->()V PLandroidx/window/layout/WindowInfoTrackerImpl$windowLayoutInfo$1$$ExternalSyntheticLambda0;->(Lkotlinx/coroutines/channels/Channel;)V PLandroidx/window/layout/WindowInfoTrackerImpl$windowLayoutInfo$1$$ExternalSyntheticLambda0;->accept(Ljava/lang/Object;)V PLandroidx/window/layout/WindowInfoTrackerImpl$windowLayoutInfo$1;->(Landroidx/window/layout/WindowInfoTrackerImpl;Landroid/app/Activity;Lkotlin/coroutines/Continuation;)V PLandroidx/window/layout/WindowInfoTrackerImpl$windowLayoutInfo$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLandroidx/window/layout/WindowInfoTrackerImpl$windowLayoutInfo$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLandroidx/window/layout/WindowInfoTrackerImpl;->(Landroidx/window/layout/WindowMetricsCalculator;Landroidx/window/layout/WindowBackend;)V PLandroidx/window/layout/WindowLayoutInfo;->(Ljava/util/List;)V PLandroidx/window/layout/WindowLayoutInfo;->equals(Ljava/lang/Object;)Z PLcom/airbnb/lottie/LottieCompositionFactory$7;->(Ljava/lang/Object;Ljava/lang/Object;ILandroidx/appcompat/R$id$$IA$1;)V PLcom/airbnb/lottie/LottieCompositionFactory$7;->call()Lcom/google/android/gms/tasks/Task; PLcom/airbnb/lottie/LottieCompositionFactory$7;->call()Ljava/lang/Object; PLcom/airbnb/lottie/LottieCompositionFactory$7;->call()Ljava/lang/Void; PLcom/airbnb/lottie/model/animatable/AnimatableTextFrame;->(I)V PLcom/airbnb/lottie/model/animatable/AnimatableTextFrame;->create()Lcom/bumptech/glide/load/engine/bitmap_recycle/Poolable; PLcom/airbnb/lottie/model/animatable/AnimatableTextFrame;->get(ILjava/lang/Class;)Lcom/bumptech/glide/load/engine/bitmap_recycle/LruArrayPool$Key; PLcom/airbnb/lottie/parser/GradientColorParser;->(II)V PLcom/airbnb/lottie/parser/IntegerParser;->()V PLcom/airbnb/lottie/parser/IntegerParser;->()V PLcom/airbnb/lottie/parser/IntegerParser;->create(Lcom/google/firebase/components/ComponentContainer;)Ljava/lang/Object; PLcom/airbnb/lottie/parser/PathParser;->()V PLcom/airbnb/lottie/parser/PathParser;->()V PLcom/airbnb/lottie/parser/PointFParser;->()V PLcom/airbnb/lottie/parser/PointFParser;->()V PLcom/airbnb/lottie/parser/ScaleXYParser;->()V PLcom/airbnb/lottie/parser/ScaleXYParser;->()V PLcom/airbnb/lottie/parser/ShapeDataParser;->()V PLcom/airbnb/lottie/parser/ShapeDataParser;->()V PLcom/airbnb/lottie/parser/ShapeDataParser;->create(Lcom/google/firebase/components/ComponentContainer;)Ljava/lang/Object; PLcom/bumptech/glide/GenericTransitionOptions;->()V PLcom/bumptech/glide/Glide;->(Landroid/content/Context;Lcom/bumptech/glide/load/engine/Engine;Lcom/bumptech/glide/load/model/ModelCache$1;Lcom/bumptech/glide/load/engine/bitmap_recycle/BitmapPool;Lcom/bumptech/glide/load/engine/bitmap_recycle/LruArrayPool;Lcom/bumptech/glide/manager/RequestManagerRetriever;Lcom/google/android/gms/dynamite/zza;ILcom/bumptech/glide/request/RequestOptions;Ljava/util/Map;Ljava/util/List;Z)V PLcom/bumptech/glide/Glide;->checkAndInitializeGlide(Landroid/content/Context;)V PLcom/bumptech/glide/Glide;->get(Landroid/content/Context;)Lcom/bumptech/glide/Glide; PLcom/bumptech/glide/Glide;->onTrimMemory(I)V PLcom/bumptech/glide/Glide;->with(Landroid/content/Context;)Lcom/bumptech/glide/RequestManager; PLcom/bumptech/glide/GlideBuilder;->()V PLcom/bumptech/glide/GlideContext;->()V PLcom/bumptech/glide/GlideContext;->(Landroid/content/Context;Lcom/bumptech/glide/load/engine/bitmap_recycle/LruArrayPool;Lcom/bumptech/glide/Registry;Lcom/google/android/gms/dynamite/zza;Lcom/bumptech/glide/request/RequestOptions;Ljava/util/Map;Ljava/util/List;Lcom/bumptech/glide/load/engine/Engine;ZI)V PLcom/bumptech/glide/Priority;->()V PLcom/bumptech/glide/Priority;->(Ljava/lang/String;I)V PLcom/bumptech/glide/Registry;->()V PLcom/bumptech/glide/Registry;->append(Ljava/lang/Class;Lcom/bumptech/glide/load/Encoder;)Lcom/bumptech/glide/Registry; PLcom/bumptech/glide/Registry;->append(Ljava/lang/Class;Lcom/bumptech/glide/load/ResourceEncoder;)Lcom/bumptech/glide/Registry; PLcom/bumptech/glide/Registry;->append(Ljava/lang/Class;Ljava/lang/Class;Lcom/bumptech/glide/load/model/ModelLoaderFactory;)Lcom/bumptech/glide/Registry; PLcom/bumptech/glide/Registry;->append(Ljava/lang/String;Ljava/lang/Class;Ljava/lang/Class;Lcom/bumptech/glide/load/ResourceDecoder;)Lcom/bumptech/glide/Registry; PLcom/bumptech/glide/Registry;->getImageHeaderParsers()Ljava/util/List; PLcom/bumptech/glide/Registry;->getModelLoaders(Ljava/lang/Object;)Ljava/util/List; PLcom/bumptech/glide/Registry;->register(Lcom/bumptech/glide/load/data/DataRewinder$Factory;)Lcom/bumptech/glide/Registry; PLcom/bumptech/glide/Registry;->register(Ljava/lang/Class;Ljava/lang/Class;Lcom/bumptech/glide/load/resource/transcode/ResourceTranscoder;)Lcom/bumptech/glide/Registry; PLcom/bumptech/glide/RequestBuilder;->()V PLcom/bumptech/glide/RequestBuilder;->(Lcom/bumptech/glide/Glide;Lcom/bumptech/glide/RequestManager;Ljava/lang/Class;Landroid/content/Context;)V PLcom/bumptech/glide/RequestBuilder;->apply(Lcom/bumptech/glide/request/BaseRequestOptions;)Lcom/bumptech/glide/RequestBuilder; PLcom/bumptech/glide/RequestBuilder;->buildRequestRecursive(Lcom/bumptech/glide/request/target/BaseTarget;Lcom/google/samples/apps/iosched/ui/speaker/SpeakerBindingAdaptersKt$speakerImage$1;Lcom/bumptech/glide/request/RequestCoordinator;Lcom/bumptech/glide/GenericTransitionOptions;Lcom/bumptech/glide/Priority;IILcom/bumptech/glide/request/BaseRequestOptions;Ljava/util/concurrent/Executor;)Lcom/bumptech/glide/request/Request; PLcom/bumptech/glide/RequestBuilder;->into(Lcom/bumptech/glide/request/target/BaseTarget;)Lcom/bumptech/glide/request/target/BaseTarget; PLcom/bumptech/glide/RequestBuilder;->into(Lcom/bumptech/glide/request/target/BaseTarget;Lcom/google/samples/apps/iosched/ui/speaker/SpeakerBindingAdaptersKt$speakerImage$1;Lcom/bumptech/glide/request/BaseRequestOptions;Ljava/util/concurrent/Executor;)Lcom/bumptech/glide/request/target/BaseTarget; PLcom/bumptech/glide/RequestBuilder;->obtainRequest(Lcom/bumptech/glide/request/target/BaseTarget;Lcom/google/samples/apps/iosched/ui/speaker/SpeakerBindingAdaptersKt$speakerImage$1;Lcom/bumptech/glide/request/BaseRequestOptions;Lcom/bumptech/glide/request/RequestCoordinator;Lcom/bumptech/glide/GenericTransitionOptions;Lcom/bumptech/glide/Priority;IILjava/util/concurrent/Executor;)Lcom/bumptech/glide/request/Request; PLcom/bumptech/glide/RequestManager;->()V PLcom/bumptech/glide/RequestManager;->(Lcom/bumptech/glide/Glide;Lcom/bumptech/glide/manager/Lifecycle;Lcom/bumptech/glide/manager/RequestManagerTreeNode;Landroid/content/Context;)V PLcom/bumptech/glide/RequestManager;->asDrawable()Lcom/bumptech/glide/RequestBuilder; PLcom/bumptech/glide/RequestManager;->clear(Lcom/bumptech/glide/request/target/BaseTarget;)V PLcom/bumptech/glide/RequestManager;->load(Landroid/graphics/drawable/Drawable;)Lcom/bumptech/glide/RequestBuilder; PLcom/bumptech/glide/RequestManager;->onDestroy()V PLcom/bumptech/glide/RequestManager;->onStart()V PLcom/bumptech/glide/RequestManager;->onStop()V PLcom/bumptech/glide/RequestManager;->untrack(Lcom/bumptech/glide/request/target/BaseTarget;)Z PLcom/bumptech/glide/RequestManager;->untrackOrDelegate(Lcom/bumptech/glide/request/target/BaseTarget;)V PLcom/bumptech/glide/disklrucache/DiskLruCache$DiskLruCacheThreadFactory;->(Lcom/google/firebase/iid/zzy;)V PLcom/bumptech/glide/disklrucache/DiskLruCache$Entry;->(Lcom/bumptech/glide/disklrucache/DiskLruCache;Ljava/lang/String;Lcom/google/firebase/iid/zzy;)V PLcom/bumptech/glide/disklrucache/DiskLruCache;->(Ljava/io/File;IIJ)V PLcom/bumptech/glide/disklrucache/DiskLruCache;->checkNotClosed()V PLcom/bumptech/glide/disklrucache/DiskLruCache;->deleteIfExists(Ljava/io/File;)V PLcom/bumptech/glide/disklrucache/DiskLruCache;->get(Ljava/lang/String;)Lcom/google/android/gms/measurement/internal/zzfl; PLcom/bumptech/glide/disklrucache/DiskLruCache;->journalRebuildRequired()Z PLcom/bumptech/glide/disklrucache/DiskLruCache;->open(Ljava/io/File;IIJ)Lcom/bumptech/glide/disklrucache/DiskLruCache; PLcom/bumptech/glide/disklrucache/DiskLruCache;->processJournal()V PLcom/bumptech/glide/disklrucache/DiskLruCache;->readJournal()V PLcom/bumptech/glide/disklrucache/DiskLruCache;->readJournalLine(Ljava/lang/String;)V PLcom/bumptech/glide/disklrucache/StrictLineReader;->(Ljava/io/InputStream;Ljava/nio/charset/Charset;)V PLcom/bumptech/glide/disklrucache/StrictLineReader;->close()V PLcom/bumptech/glide/disklrucache/StrictLineReader;->fillBuf()V PLcom/bumptech/glide/disklrucache/StrictLineReader;->readLine()Ljava/lang/String; PLcom/bumptech/glide/disklrucache/Util;->()V PLcom/bumptech/glide/load/DataSource;->()V PLcom/bumptech/glide/load/DataSource;->(Ljava/lang/String;I)V PLcom/bumptech/glide/load/DecodeFormat;->()V PLcom/bumptech/glide/load/DecodeFormat;->(Ljava/lang/String;I)V PLcom/bumptech/glide/load/ImageHeaderParser$ImageType;->()V PLcom/bumptech/glide/load/ImageHeaderParser$ImageType;->(Ljava/lang/String;IZ)V PLcom/bumptech/glide/load/ImageHeaderParser$ImageType;->values()[Lcom/bumptech/glide/load/ImageHeaderParser$ImageType; PLcom/bumptech/glide/load/Key;->()V PLcom/bumptech/glide/load/Option$1;->()V PLcom/bumptech/glide/load/Option$1;->()V PLcom/bumptech/glide/load/Option$1;->readFrom(Ljava/io/InputStream;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLcom/bumptech/glide/load/Option$1;->runMigrations(Ljava/util/List;Landroidx/datastore/core/SingleProcessDataStore$readAndInit$api$1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLcom/bumptech/glide/load/Option$1;->update([BLjava/lang/Object;Ljava/security/MessageDigest;)V PLcom/bumptech/glide/load/Option;->()V PLcom/bumptech/glide/load/Option;->(Ljava/lang/String;Ljava/lang/Object;Lcom/bumptech/glide/load/Option$CacheKeyUpdater;)V PLcom/bumptech/glide/load/Option;->equals(Ljava/lang/Object;)Z PLcom/bumptech/glide/load/Option;->hashCode()I PLcom/bumptech/glide/load/Option;->memory(Ljava/lang/String;Ljava/lang/Object;)Lcom/bumptech/glide/load/Option; PLcom/bumptech/glide/load/Options;->()V PLcom/bumptech/glide/load/Options;->equals(Ljava/lang/Object;)Z PLcom/bumptech/glide/load/Options;->get(Lcom/bumptech/glide/load/Option;)Ljava/lang/Object; PLcom/bumptech/glide/load/Options;->hashCode()I PLcom/bumptech/glide/load/Options;->putAll(Lcom/bumptech/glide/load/Options;)V PLcom/bumptech/glide/load/Options;->updateDiskCacheKey(Ljava/security/MessageDigest;)V PLcom/bumptech/glide/load/data/DataRewinderRegistry$1;->(I)V PLcom/bumptech/glide/load/data/DataRewinderRegistry$1;->build(Ljava/lang/Object;)Lcom/bumptech/glide/load/data/DataRewinder; PLcom/bumptech/glide/load/data/DataRewinderRegistry$1;->getDataClass()Ljava/lang/Class; PLcom/bumptech/glide/load/data/DataRewinderRegistry;->()V PLcom/bumptech/glide/load/data/DataRewinderRegistry;->()V PLcom/bumptech/glide/load/data/FileDescriptorLocalUriFetcher;->(Landroid/content/ContentResolver;Landroid/net/Uri;I)V PLcom/bumptech/glide/load/data/FileDescriptorLocalUriFetcher;->getDataClass()Ljava/lang/Class; PLcom/bumptech/glide/load/data/FileDescriptorLocalUriFetcher;->loadResource(Landroid/net/Uri;Landroid/content/ContentResolver;)Ljava/lang/Object; PLcom/bumptech/glide/load/data/InputStreamRewinder$Factory;->(Lcom/bumptech/glide/load/engine/bitmap_recycle/LruArrayPool;)V PLcom/bumptech/glide/load/data/InputStreamRewinder$Factory;->build(Ljava/lang/Object;)Lcom/bumptech/glide/load/data/DataRewinder; PLcom/bumptech/glide/load/data/InputStreamRewinder$Factory;->getDataClass()Ljava/lang/Class; PLcom/bumptech/glide/load/data/LocalUriFetcher;->(Ljava/lang/Object;Ljava/lang/Object;I)V PLcom/bumptech/glide/load/data/LocalUriFetcher;->cleanup()V PLcom/bumptech/glide/load/data/LocalUriFetcher;->getDataSource()Lcom/bumptech/glide/load/DataSource; PLcom/bumptech/glide/load/data/LocalUriFetcher;->loadData(Lcom/bumptech/glide/Priority;Lcom/bumptech/glide/load/data/DataFetcher$DataCallback;)V PLcom/bumptech/glide/load/data/StreamLocalUriFetcher;->()V PLcom/bumptech/glide/load/data/StreamLocalUriFetcher;->(Landroid/content/ContentResolver;Landroid/net/Uri;)V PLcom/bumptech/glide/load/data/StreamLocalUriFetcher;->close(Ljava/lang/Object;)V PLcom/bumptech/glide/load/data/StreamLocalUriFetcher;->getDataClass()Ljava/lang/Class; PLcom/bumptech/glide/load/data/StreamLocalUriFetcher;->loadResource(Landroid/net/Uri;Landroid/content/ContentResolver;)Ljava/lang/Object; PLcom/bumptech/glide/load/engine/ActiveResources$1;->()V PLcom/bumptech/glide/load/engine/ActiveResources$1;->newThread(Ljava/lang/Runnable;)Ljava/lang/Thread; PLcom/bumptech/glide/load/engine/ActiveResources$ResourceWeakReference;->(Lcom/bumptech/glide/load/Key;Lcom/bumptech/glide/load/engine/EngineResource;Ljava/lang/ref/ReferenceQueue;Z)V PLcom/bumptech/glide/load/engine/ActiveResources;->(Z)V PLcom/bumptech/glide/load/engine/ActiveResources;->activate(Lcom/bumptech/glide/load/Key;Lcom/bumptech/glide/load/engine/EngineResource;)V PLcom/bumptech/glide/load/engine/DataCacheGenerator;->(Lcom/bumptech/glide/load/engine/DecodeHelper;Lcom/bumptech/glide/load/engine/DataFetcherGenerator$FetcherReadyCallback;)V PLcom/bumptech/glide/load/engine/DataCacheGenerator;->startNext()Z PLcom/bumptech/glide/load/engine/DataCacheKey;->(Lcom/bumptech/glide/load/Key;Lcom/bumptech/glide/load/Key;)V PLcom/bumptech/glide/load/engine/DataCacheKey;->hashCode()I PLcom/bumptech/glide/load/engine/DataCacheKey;->updateDiskCacheKey(Ljava/security/MessageDigest;)V PLcom/bumptech/glide/load/engine/DataCacheWriter;->()V PLcom/bumptech/glide/load/engine/DataCacheWriter;->(Lcom/bumptech/glide/load/Encoder;Ljava/lang/Object;Lcom/bumptech/glide/load/Options;)V PLcom/bumptech/glide/load/engine/DataCacheWriter;->(Lcom/bumptech/glide/load/engine/Engine;Lcom/bumptech/glide/request/ResourceCallback;Lcom/bumptech/glide/load/engine/EngineJob;)V PLcom/bumptech/glide/load/engine/DataCacheWriter;->encode(Lcom/bumptech/glide/load/engine/Engine$LazyDiskCacheProvider;Lcom/bumptech/glide/load/Options;)V PLcom/bumptech/glide/load/engine/DecodeHelper;->()V PLcom/bumptech/glide/load/engine/DecodeHelper;->getCacheKeys()Ljava/util/List; PLcom/bumptech/glide/load/engine/DecodeHelper;->getDiskCache()Lcom/bumptech/glide/load/engine/cache/DiskCache; PLcom/bumptech/glide/load/engine/DecodeHelper;->getLoadData()Ljava/util/List; PLcom/bumptech/glide/load/engine/DecodeHelper;->getTransformation(Ljava/lang/Class;)Lcom/bumptech/glide/load/Transformation; PLcom/bumptech/glide/load/engine/DecodeHelper;->hasLoadPath(Ljava/lang/Class;)Z PLcom/bumptech/glide/load/engine/DecodeJob$ReleaseManager;->()V PLcom/bumptech/glide/load/engine/DecodeJob$ReleaseManager;->isComplete(Z)Z PLcom/bumptech/glide/load/engine/DecodeJob;->(Lcom/bumptech/glide/load/engine/Engine$LazyDiskCacheProvider;Landroidx/core/util/Pools$Pool;)V PLcom/bumptech/glide/load/engine/DecodeJob;->decodeFromData(Lcom/bumptech/glide/load/data/DataFetcher;Ljava/lang/Object;Lcom/bumptech/glide/load/DataSource;)Lcom/bumptech/glide/load/engine/Resource; PLcom/bumptech/glide/load/engine/DecodeJob;->decodeFromFetcher(Ljava/lang/Object;Lcom/bumptech/glide/load/DataSource;)Lcom/bumptech/glide/load/engine/Resource; PLcom/bumptech/glide/load/engine/DecodeJob;->decodeFromRetrievedData()V PLcom/bumptech/glide/load/engine/DecodeJob;->getNextGenerator()Lcom/bumptech/glide/load/engine/DataFetcherGenerator; PLcom/bumptech/glide/load/engine/DecodeJob;->getNextStage$enumunboxing$(I)I PLcom/bumptech/glide/load/engine/DecodeJob;->getVerifier()Lcom/bumptech/glide/util/pool/StateVerifier$DefaultStateVerifier; PLcom/bumptech/glide/load/engine/DecodeJob;->notifyFailed()V PLcom/bumptech/glide/load/engine/DecodeJob;->onDataFetcherFailed(Lcom/bumptech/glide/load/Key;Ljava/lang/Exception;Lcom/bumptech/glide/load/data/DataFetcher;Lcom/bumptech/glide/load/DataSource;)V PLcom/bumptech/glide/load/engine/DecodeJob;->onDataFetcherReady(Lcom/bumptech/glide/load/Key;Ljava/lang/Object;Lcom/bumptech/glide/load/data/DataFetcher;Lcom/bumptech/glide/load/DataSource;Lcom/bumptech/glide/load/Key;)V PLcom/bumptech/glide/load/engine/DecodeJob;->releaseInternal()V PLcom/bumptech/glide/load/engine/DecodeJob;->run()V PLcom/bumptech/glide/load/engine/DecodeJob;->runGenerators()V PLcom/bumptech/glide/load/engine/DecodeJob;->runWrapped()V PLcom/bumptech/glide/load/engine/DecodeJob;->setNotifiedOrThrow()V PLcom/bumptech/glide/load/engine/DecodePath;->(Ljava/lang/Class;Ljava/lang/Class;Ljava/lang/Class;Ljava/util/List;Lcom/bumptech/glide/load/resource/transcode/ResourceTranscoder;Landroidx/core/util/Pools$Pool;)V PLcom/bumptech/glide/load/engine/DecodePath;->decode(Lcom/bumptech/glide/load/data/DataRewinder;IILcom/bumptech/glide/load/Options;Lcom/google/firebase/messaging/zzj;)Lcom/bumptech/glide/load/engine/Resource; PLcom/bumptech/glide/load/engine/DecodePath;->decodeResourceWithList(Lcom/bumptech/glide/load/data/DataRewinder;IILcom/bumptech/glide/load/Options;Ljava/util/List;)Lcom/bumptech/glide/load/engine/Resource; PLcom/bumptech/glide/load/engine/DiskCacheStrategy$1;->(I)V PLcom/bumptech/glide/load/engine/DiskCacheStrategy$1;->isDataCacheable(Lcom/bumptech/glide/load/DataSource;)Z PLcom/bumptech/glide/load/engine/DiskCacheStrategy;->()V PLcom/bumptech/glide/load/engine/DiskCacheStrategy;->()V PLcom/bumptech/glide/load/engine/Engine$LazyDiskCacheProvider;->(Lcom/bumptech/glide/load/engine/cache/DiskLruCacheFactory;)V PLcom/bumptech/glide/load/engine/Engine$LazyDiskCacheProvider;->getDiskCache()Lcom/bumptech/glide/load/engine/cache/DiskCache; PLcom/bumptech/glide/load/engine/Engine;->()V PLcom/bumptech/glide/load/engine/Engine;->(Lcom/bumptech/glide/load/model/ModelCache$1;Lcom/bumptech/glide/load/engine/cache/DiskLruCacheFactory;Lcom/bumptech/glide/load/engine/executor/GlideExecutor;Lcom/bumptech/glide/load/engine/executor/GlideExecutor;Lcom/bumptech/glide/load/engine/executor/GlideExecutor;Lcom/bumptech/glide/load/engine/executor/GlideExecutor;Z)V PLcom/bumptech/glide/load/engine/Engine;->load(Lcom/bumptech/glide/GlideContext;Ljava/lang/Object;Lcom/bumptech/glide/load/Key;IILjava/lang/Class;Ljava/lang/Class;Lcom/bumptech/glide/Priority;Lcom/bumptech/glide/load/engine/DiskCacheStrategy;Ljava/util/Map;ZZLcom/bumptech/glide/load/Options;ZZZZLcom/bumptech/glide/request/ResourceCallback;Ljava/util/concurrent/Executor;)Lcom/bumptech/glide/load/engine/DataCacheWriter; PLcom/bumptech/glide/load/engine/Engine;->loadFromCache(Lcom/bumptech/glide/load/Key;Z)Lcom/bumptech/glide/load/engine/EngineResource; PLcom/bumptech/glide/load/engine/Engine;->onEngineJobComplete(Lcom/bumptech/glide/load/engine/EngineJob;Lcom/bumptech/glide/load/Key;Lcom/bumptech/glide/load/engine/EngineResource;)V PLcom/bumptech/glide/load/engine/Engine;->onResourceReleased(Lcom/bumptech/glide/load/Key;Lcom/bumptech/glide/load/engine/EngineResource;)V PLcom/bumptech/glide/load/engine/EngineJob$CallLoadFailed;->(Lcom/bumptech/glide/load/engine/EngineJob;Lcom/bumptech/glide/request/ResourceCallback;I)V PLcom/bumptech/glide/load/engine/EngineJob$CallLoadFailed;->run()V PLcom/bumptech/glide/load/engine/EngineJob$ResourceCallbackAndExecutor;->(Lcom/bumptech/glide/request/ResourceCallback;Ljava/util/concurrent/Executor;)V PLcom/bumptech/glide/load/engine/EngineJob$ResourceCallbackAndExecutor;->equals(Ljava/lang/Object;)Z PLcom/bumptech/glide/load/engine/EngineJob$ResourceCallbacksAndExecutors;->()V PLcom/bumptech/glide/load/engine/EngineJob$ResourceCallbacksAndExecutors;->isEmpty()Z PLcom/bumptech/glide/load/engine/EngineJob;->()V PLcom/bumptech/glide/load/engine/EngineJob;->(Lcom/bumptech/glide/load/engine/executor/GlideExecutor;Lcom/bumptech/glide/load/engine/executor/GlideExecutor;Lcom/bumptech/glide/load/engine/executor/GlideExecutor;Lcom/bumptech/glide/load/engine/executor/GlideExecutor;Lcom/bumptech/glide/load/engine/EngineJobListener;Landroidx/core/util/Pools$Pool;)V PLcom/bumptech/glide/load/engine/EngineJob;->addCallback(Lcom/bumptech/glide/request/ResourceCallback;Ljava/util/concurrent/Executor;)V PLcom/bumptech/glide/load/engine/EngineJob;->cancel()V PLcom/bumptech/glide/load/engine/EngineJob;->decrementPendingCallbacks()V PLcom/bumptech/glide/load/engine/EngineJob;->getVerifier()Lcom/bumptech/glide/util/pool/StateVerifier$DefaultStateVerifier; PLcom/bumptech/glide/load/engine/EngineJob;->incrementPendingCallbacks(I)V PLcom/bumptech/glide/load/engine/EngineJob;->isDone()Z PLcom/bumptech/glide/load/engine/EngineJob;->release()V PLcom/bumptech/glide/load/engine/EngineJob;->removeCallback(Lcom/bumptech/glide/request/ResourceCallback;)V PLcom/bumptech/glide/load/engine/EngineJob;->reschedule(Lcom/bumptech/glide/load/engine/DecodeJob;)V PLcom/bumptech/glide/load/engine/EngineJob;->start(Lcom/bumptech/glide/load/engine/DecodeJob;)V PLcom/bumptech/glide/load/engine/EngineKey;->(Ljava/lang/Object;Lcom/bumptech/glide/load/Key;IILjava/util/Map;Ljava/lang/Class;Ljava/lang/Class;Lcom/bumptech/glide/load/Options;)V PLcom/bumptech/glide/load/engine/EngineKey;->equals(Ljava/lang/Object;)Z PLcom/bumptech/glide/load/engine/EngineKey;->hashCode()I PLcom/bumptech/glide/load/engine/EngineResource;->(Lcom/bumptech/glide/load/engine/Resource;ZZ)V PLcom/bumptech/glide/load/engine/EngineResource;->acquire()V PLcom/bumptech/glide/load/engine/EngineResource;->get()Ljava/lang/Object; PLcom/bumptech/glide/load/engine/EngineResource;->getSize()I PLcom/bumptech/glide/load/engine/EngineResource;->release()V PLcom/bumptech/glide/load/engine/GlideException;->()V PLcom/bumptech/glide/load/engine/GlideException;->(Ljava/lang/String;Ljava/lang/Throwable;)V PLcom/bumptech/glide/load/engine/GlideException;->(Ljava/lang/String;Ljava/util/List;)V PLcom/bumptech/glide/load/engine/GlideException;->fillInStackTrace()Ljava/lang/Throwable; PLcom/bumptech/glide/load/engine/Jobs;->(I)V PLcom/bumptech/glide/load/engine/Jobs;->getJobMap(Z)Ljava/util/Map; PLcom/bumptech/glide/load/engine/LoadPath;->(Ljava/lang/Class;Ljava/lang/Class;Ljava/lang/Class;Ljava/util/List;Landroidx/core/util/Pools$Pool;)V PLcom/bumptech/glide/load/engine/LoadPath;->load(Lcom/bumptech/glide/load/data/DataRewinder;Lcom/bumptech/glide/load/Options;IILcom/google/firebase/messaging/zzj;)Lcom/bumptech/glide/load/engine/Resource; PLcom/bumptech/glide/load/engine/LockedResource;->()V PLcom/bumptech/glide/load/engine/LockedResource;->()V PLcom/bumptech/glide/load/engine/LockedResource;->get()Ljava/lang/Object; PLcom/bumptech/glide/load/engine/LockedResource;->getSize()I PLcom/bumptech/glide/load/engine/LockedResource;->getVerifier()Lcom/bumptech/glide/util/pool/StateVerifier$DefaultStateVerifier; PLcom/bumptech/glide/load/engine/LockedResource;->obtain(Lcom/bumptech/glide/load/engine/Resource;)Lcom/bumptech/glide/load/engine/LockedResource; PLcom/bumptech/glide/load/engine/LockedResource;->unlock()V PLcom/bumptech/glide/load/engine/ResourceCacheGenerator;->(Lcom/bumptech/glide/load/engine/DecodeHelper;Lcom/bumptech/glide/load/engine/DataFetcherGenerator$FetcherReadyCallback;)V PLcom/bumptech/glide/load/engine/ResourceCacheGenerator;->startNext()Z PLcom/bumptech/glide/load/engine/ResourceCacheKey;->()V PLcom/bumptech/glide/load/engine/ResourceCacheKey;->(Lcom/bumptech/glide/load/engine/bitmap_recycle/LruArrayPool;Lcom/bumptech/glide/load/Key;Lcom/bumptech/glide/load/Key;IILcom/bumptech/glide/load/Transformation;Ljava/lang/Class;Lcom/bumptech/glide/load/Options;)V PLcom/bumptech/glide/load/engine/ResourceCacheKey;->hashCode()I PLcom/bumptech/glide/load/engine/ResourceCacheKey;->updateDiskCacheKey(Ljava/security/MessageDigest;)V PLcom/bumptech/glide/load/engine/ResourceRecycler$ResourceRecyclerCallback;->()V PLcom/bumptech/glide/load/engine/SourceGenerator;->(Lcom/bumptech/glide/load/engine/DecodeHelper;Lcom/bumptech/glide/load/engine/DataFetcherGenerator$FetcherReadyCallback;)V PLcom/bumptech/glide/load/engine/SourceGenerator;->onDataReady(Ljava/lang/Object;)V PLcom/bumptech/glide/load/engine/SourceGenerator;->onLoadFailed(Ljava/lang/Exception;)V PLcom/bumptech/glide/load/engine/SourceGenerator;->startNext()Z PLcom/bumptech/glide/load/engine/bitmap_recycle/ByteArrayAdapter;->(I)V PLcom/bumptech/glide/load/engine/bitmap_recycle/ByteArrayAdapter;->getArrayLength(Ljava/lang/Object;)I PLcom/bumptech/glide/load/engine/bitmap_recycle/ByteArrayAdapter;->getElementSizeInBytes()I PLcom/bumptech/glide/load/engine/bitmap_recycle/ByteArrayAdapter;->getTag()Ljava/lang/String; PLcom/bumptech/glide/load/engine/bitmap_recycle/GroupedLinkedMap$LinkedEntry;->(Ljava/lang/Object;)V PLcom/bumptech/glide/load/engine/bitmap_recycle/GroupedLinkedMap$LinkedEntry;->removeLast()Ljava/lang/Object; PLcom/bumptech/glide/load/engine/bitmap_recycle/LruArrayPool$Key;->(Lcom/airbnb/lottie/model/animatable/AnimatableTextFrame;)V PLcom/bumptech/glide/load/engine/bitmap_recycle/LruArrayPool$Key;->equals(Ljava/lang/Object;)Z PLcom/bumptech/glide/load/engine/bitmap_recycle/LruArrayPool$Key;->hashCode()I PLcom/bumptech/glide/load/engine/bitmap_recycle/LruArrayPool$Key;->offer()V PLcom/bumptech/glide/load/engine/bitmap_recycle/LruArrayPool;->(I)V PLcom/bumptech/glide/load/engine/bitmap_recycle/LruArrayPool;->decrementArrayOfSize(ILjava/lang/Class;)V PLcom/bumptech/glide/load/engine/bitmap_recycle/LruArrayPool;->evictToSize(I)V PLcom/bumptech/glide/load/engine/bitmap_recycle/LruArrayPool;->get(ILjava/lang/Class;)Ljava/lang/Object; PLcom/bumptech/glide/load/engine/bitmap_recycle/LruArrayPool;->getAdapterFromType(Ljava/lang/Class;)Lcom/bumptech/glide/load/engine/bitmap_recycle/ArrayAdapterInterface; PLcom/bumptech/glide/load/engine/bitmap_recycle/LruArrayPool;->getForKey(Lcom/bumptech/glide/load/engine/bitmap_recycle/LruArrayPool$Key;Ljava/lang/Class;)Ljava/lang/Object; PLcom/bumptech/glide/load/engine/bitmap_recycle/LruArrayPool;->getSizesForAdapter(Ljava/lang/Class;)Ljava/util/NavigableMap; PLcom/bumptech/glide/load/engine/bitmap_recycle/LruArrayPool;->put(Ljava/lang/Object;)V PLcom/bumptech/glide/load/engine/bitmap_recycle/LruBitmapPool;->()V PLcom/bumptech/glide/load/engine/bitmap_recycle/LruBitmapPool;->(J)V PLcom/bumptech/glide/load/engine/bitmap_recycle/LruBitmapPool;->dump()V PLcom/bumptech/glide/load/engine/bitmap_recycle/LruBitmapPool;->get(IILandroid/graphics/Bitmap$Config;)Landroid/graphics/Bitmap; PLcom/bumptech/glide/load/engine/bitmap_recycle/LruBitmapPool;->getDirtyOrNull(IILandroid/graphics/Bitmap$Config;)Landroid/graphics/Bitmap; PLcom/bumptech/glide/load/engine/bitmap_recycle/LruBitmapPool;->trimMemory(I)V PLcom/bumptech/glide/load/engine/bitmap_recycle/LruBitmapPool;->trimToSize(J)V PLcom/bumptech/glide/load/engine/bitmap_recycle/SizeConfigStrategy$1;->()V PLcom/bumptech/glide/load/engine/bitmap_recycle/SizeConfigStrategy$Key;->(Lcom/airbnb/lottie/model/animatable/AnimatableTextFrame;)V PLcom/bumptech/glide/load/engine/bitmap_recycle/SizeConfigStrategy$Key;->hashCode()I PLcom/bumptech/glide/load/engine/bitmap_recycle/SizeConfigStrategy;->()V PLcom/bumptech/glide/load/engine/bitmap_recycle/SizeConfigStrategy;->()V PLcom/bumptech/glide/load/engine/bitmap_recycle/SizeConfigStrategy;->get(IILandroid/graphics/Bitmap$Config;)Landroid/graphics/Bitmap; PLcom/bumptech/glide/load/engine/bitmap_recycle/SizeConfigStrategy;->getSizesForConfig(Landroid/graphics/Bitmap$Config;)Ljava/util/NavigableMap; PLcom/bumptech/glide/load/engine/cache/DiskCacheWriteLocker$WriteLock;->()V PLcom/bumptech/glide/load/engine/cache/DiskCacheWriteLocker$WriteLockPool;->(I)V PLcom/bumptech/glide/load/engine/cache/DiskLruCacheFactory;->(Lio/grpc/CallOptions$Key;J)V PLcom/bumptech/glide/load/engine/cache/DiskLruCacheFactory;->build()Lcom/bumptech/glide/load/engine/cache/DiskCache; PLcom/bumptech/glide/load/engine/cache/InternalCacheDiskCacheFactory;->(Landroid/content/Context;)V PLcom/bumptech/glide/load/engine/cache/MemorySizeCalculator$Builder;->()V PLcom/bumptech/glide/load/engine/cache/MemorySizeCalculator$Builder;->(Landroid/content/Context;)V PLcom/bumptech/glide/load/engine/cache/MemorySizeCalculator;->(Lcom/bumptech/glide/load/engine/cache/MemorySizeCalculator$Builder;)V PLcom/bumptech/glide/load/engine/cache/SafeKeyGenerator$PoolableDigestContainer;->(Ljava/security/MessageDigest;)V PLcom/bumptech/glide/load/engine/cache/SafeKeyGenerator$PoolableDigestContainer;->getVerifier()Lcom/bumptech/glide/util/pool/StateVerifier$DefaultStateVerifier; PLcom/bumptech/glide/load/engine/executor/GlideExecutor$DefaultThreadFactory;->(Ljava/lang/String;Lcom/bumptech/glide/load/engine/executor/GlideExecutor$UncaughtThrowableStrategy;Z)V PLcom/bumptech/glide/load/engine/executor/GlideExecutor$DefaultThreadFactory;->newThread(Ljava/lang/Runnable;)Ljava/lang/Thread; PLcom/bumptech/glide/load/engine/executor/GlideExecutor$UncaughtThrowableStrategy;->()V PLcom/bumptech/glide/load/engine/executor/GlideExecutor;->()V PLcom/bumptech/glide/load/engine/executor/GlideExecutor;->(Ljava/util/concurrent/ExecutorService;)V PLcom/bumptech/glide/load/engine/executor/GlideExecutor;->calculateBestThreadCount()I PLcom/bumptech/glide/load/engine/executor/GlideExecutor;->newAnimationExecutor()Lcom/bumptech/glide/load/engine/executor/GlideExecutor; PLcom/bumptech/glide/load/engine/executor/RuntimeCompat$1;->(Ljava/lang/Object;I)V PLcom/bumptech/glide/load/engine/executor/RuntimeCompat$1;->accept(Ljava/io/File;Ljava/lang/String;)Z PLcom/bumptech/glide/load/model/AssetUriLoader;->(Landroid/content/res/AssetManager;Lcom/bumptech/glide/load/model/AssetUriLoader$AssetFetcherFactory;)V PLcom/bumptech/glide/load/model/AssetUriLoader;->handles(Ljava/lang/Object;)Z PLcom/bumptech/glide/load/model/ByteBufferFileLoader;->(I)V PLcom/bumptech/glide/load/model/FileLoader$StreamFactory;->(I)V PLcom/bumptech/glide/load/model/FileLoader;->(Ljava/lang/Object;I)V PLcom/bumptech/glide/load/model/FileLoader;->handles(Ljava/lang/Object;)Z PLcom/bumptech/glide/load/model/MediaStoreFileLoader$Factory;->(Landroid/content/Context;I)V PLcom/bumptech/glide/load/model/MediaStoreFileLoader$Factory;->build(Lcom/bumptech/glide/load/model/MultiModelLoaderFactory;)Lcom/bumptech/glide/load/model/ModelLoader; PLcom/bumptech/glide/load/model/MediaStoreFileLoader$Factory;->getApplicationInfo(Ljava/lang/String;I)Landroid/content/pm/ApplicationInfo; PLcom/bumptech/glide/load/model/MediaStoreFileLoader$Factory;->isCallerInstantApp()Z PLcom/bumptech/glide/load/model/MediaStoreFileLoader;->(Landroid/content/Context;I)V PLcom/bumptech/glide/load/model/MediaStoreFileLoader;->handles(Landroid/net/Uri;)Z PLcom/bumptech/glide/load/model/MediaStoreFileLoader;->handles(Ljava/lang/Object;)Z PLcom/bumptech/glide/load/model/ModelCache$1;->(J)V PLcom/bumptech/glide/load/model/ModelCache$1;->(Landroidx/compose/runtime/Stack;J)V PLcom/bumptech/glide/load/model/ModelCache$1;->getSize(Ljava/lang/Object;)I PLcom/bumptech/glide/load/model/ModelLoader$LoadData;->(Lcom/bumptech/glide/load/Key;Lcom/bumptech/glide/load/data/DataFetcher;)V PLcom/bumptech/glide/load/model/ModelLoaderRegistry$ModelLoaderCache$Entry;->(Ljava/util/List;)V PLcom/bumptech/glide/load/model/MultiModelLoaderFactory$Entry;->(Ljava/lang/Class;Ljava/lang/Class;Lcom/bumptech/glide/load/model/ModelLoaderFactory;)V PLcom/bumptech/glide/load/model/MultiModelLoaderFactory;->()V PLcom/bumptech/glide/load/model/MultiModelLoaderFactory;->(Landroidx/core/util/Pools$Pool;)V PLcom/bumptech/glide/load/model/MultiModelLoaderFactory;->build(Lcom/bumptech/glide/load/model/MultiModelLoaderFactory$Entry;)Lcom/bumptech/glide/load/model/ModelLoader; PLcom/bumptech/glide/load/model/MultiModelLoaderFactory;->build(Ljava/lang/Class;)Ljava/util/List; PLcom/bumptech/glide/load/model/MultiModelLoaderFactory;->build(Ljava/lang/Class;Ljava/lang/Class;)Lcom/bumptech/glide/load/model/ModelLoader; PLcom/bumptech/glide/load/model/MultiModelLoaderFactory;->getDataClasses(Ljava/lang/Class;)Ljava/util/List; PLcom/bumptech/glide/load/model/ResourceLoader$FileDescriptorFactory;->(Landroid/content/res/Resources;I)V PLcom/bumptech/glide/load/model/ResourceLoader$UriFactory;->(Landroid/content/res/Resources;I)V PLcom/bumptech/glide/load/model/UnitModelLoader$UnitFetcher;->(Ljava/lang/Object;I)V PLcom/bumptech/glide/load/model/UnitModelLoader$UnitFetcher;->cleanup()V PLcom/bumptech/glide/load/model/UnitModelLoader$UnitFetcher;->getDataClass()Ljava/lang/Class; PLcom/bumptech/glide/load/model/UnitModelLoader$UnitFetcher;->getDataSource()Lcom/bumptech/glide/load/DataSource; PLcom/bumptech/glide/load/model/UnitModelLoader$UnitFetcher;->loadData(Lcom/bumptech/glide/Priority;Lcom/bumptech/glide/load/data/DataFetcher$DataCallback;)V PLcom/bumptech/glide/load/model/UnitModelLoader;->()V PLcom/bumptech/glide/load/model/UnitModelLoader;->()V PLcom/bumptech/glide/load/model/UnitModelLoader;->buildLoadData(Ljava/lang/Object;IILcom/bumptech/glide/load/Options;)Lcom/bumptech/glide/load/model/ModelLoader$LoadData; PLcom/bumptech/glide/load/model/UnitModelLoader;->handles(Ljava/lang/Object;)Z PLcom/bumptech/glide/load/model/UriLoader;->()V PLcom/bumptech/glide/load/model/UriLoader;->(Lcom/bumptech/glide/load/model/UriLoader$LocalUriFetcherFactory;)V PLcom/bumptech/glide/load/model/UriLoader;->buildLoadData(Ljava/lang/Object;IILcom/bumptech/glide/load/Options;)Lcom/bumptech/glide/load/model/ModelLoader$LoadData; PLcom/bumptech/glide/load/model/UriLoader;->handles(Ljava/lang/Object;)Z PLcom/bumptech/glide/load/model/UrlUriLoader;->()V PLcom/bumptech/glide/load/model/UrlUriLoader;->(Lcom/bumptech/glide/load/model/ModelLoader;)V PLcom/bumptech/glide/load/model/UrlUriLoader;->handles(Ljava/lang/Object;)Z PLcom/bumptech/glide/load/model/stream/HttpGlideUrlLoader;->()V PLcom/bumptech/glide/load/model/stream/HttpGlideUrlLoader;->(Landroidx/compose/runtime/Stack;)V PLcom/bumptech/glide/load/model/stream/HttpUriLoader;->()V PLcom/bumptech/glide/load/model/stream/HttpUriLoader;->(Lcom/bumptech/glide/load/model/ModelLoader;)V PLcom/bumptech/glide/load/model/stream/HttpUriLoader;->handles(Ljava/lang/Object;)Z PLcom/bumptech/glide/load/resource/bitmap/BitmapEncoder;->()V PLcom/bumptech/glide/load/resource/bitmap/BitmapEncoder;->(Lcom/bumptech/glide/load/engine/bitmap_recycle/LruArrayPool;)V PLcom/bumptech/glide/load/resource/bitmap/BitmapEncoder;->getEncodeStrategy$enumunboxing$(Lcom/bumptech/glide/load/Options;)I PLcom/bumptech/glide/load/resource/bitmap/BitmapResource;->(Landroid/content/res/Resources;Lcom/bumptech/glide/load/engine/Resource;)V PLcom/bumptech/glide/load/resource/bitmap/BitmapResource;->(Landroid/graphics/Bitmap;Lcom/bumptech/glide/load/engine/bitmap_recycle/BitmapPool;)V PLcom/bumptech/glide/load/resource/bitmap/BitmapResource;->get()Ljava/lang/Object; PLcom/bumptech/glide/load/resource/bitmap/BitmapResource;->getResourceClass()Ljava/lang/Class; PLcom/bumptech/glide/load/resource/bitmap/BitmapResource;->getSize()I PLcom/bumptech/glide/load/resource/bitmap/BitmapResource;->obtain(Landroid/content/res/Resources;Lcom/bumptech/glide/load/engine/Resource;)Lcom/bumptech/glide/load/engine/Resource; PLcom/bumptech/glide/load/resource/bitmap/BitmapResource;->obtain(Landroid/graphics/Bitmap;Lcom/bumptech/glide/load/engine/bitmap_recycle/BitmapPool;)Lcom/bumptech/glide/load/resource/bitmap/BitmapResource; PLcom/bumptech/glide/load/resource/bitmap/BitmapTransformation;->()V PLcom/bumptech/glide/load/resource/bitmap/BitmapTransformation;->transform(Landroid/content/Context;Lcom/bumptech/glide/load/engine/Resource;II)Lcom/bumptech/glide/load/engine/Resource; PLcom/bumptech/glide/load/resource/bitmap/CircleCrop;->()V PLcom/bumptech/glide/load/resource/bitmap/CircleCrop;->()V PLcom/bumptech/glide/load/resource/bitmap/CircleCrop;->equals(Ljava/lang/Object;)Z PLcom/bumptech/glide/load/resource/bitmap/CircleCrop;->hashCode()I PLcom/bumptech/glide/load/resource/bitmap/CircleCrop;->transform(Lcom/bumptech/glide/load/engine/bitmap_recycle/BitmapPool;Landroid/graphics/Bitmap;II)Landroid/graphics/Bitmap; PLcom/bumptech/glide/load/resource/bitmap/CircleCrop;->updateDiskCacheKey(Ljava/security/MessageDigest;)V PLcom/bumptech/glide/load/resource/bitmap/DefaultImageHeaderParser;->()V PLcom/bumptech/glide/load/resource/bitmap/DefaultImageHeaderParser;->()V PLcom/bumptech/glide/load/resource/bitmap/DefaultImageHeaderParser;->getOrientation(Ljava/io/InputStream;Lcom/bumptech/glide/load/engine/bitmap_recycle/LruArrayPool;)I PLcom/bumptech/glide/load/resource/bitmap/DefaultImageHeaderParser;->getType(Lcom/bumptech/glide/load/resource/bitmap/DefaultImageHeaderParser$Reader;)Lcom/bumptech/glide/load/ImageHeaderParser$ImageType; PLcom/bumptech/glide/load/resource/bitmap/DefaultImageHeaderParser;->getType(Ljava/io/InputStream;)Lcom/bumptech/glide/load/ImageHeaderParser$ImageType; PLcom/bumptech/glide/load/resource/bitmap/DownsampleStrategy$None;->(I)V PLcom/bumptech/glide/load/resource/bitmap/DownsampleStrategy;->()V PLcom/bumptech/glide/load/resource/bitmap/DownsampleStrategy;->()V PLcom/bumptech/glide/load/resource/bitmap/Downsampler;->()V PLcom/bumptech/glide/load/resource/bitmap/Downsampler;->(Ljava/util/List;Landroid/util/DisplayMetrics;Lcom/bumptech/glide/load/engine/bitmap_recycle/BitmapPool;Lcom/bumptech/glide/load/engine/bitmap_recycle/LruArrayPool;)V PLcom/bumptech/glide/load/resource/bitmap/Downsampler;->decode(Ljava/io/InputStream;IILcom/bumptech/glide/load/Options;Lcom/bumptech/glide/load/resource/bitmap/Downsampler$DecodeCallbacks;)Lcom/bumptech/glide/load/engine/Resource; PLcom/bumptech/glide/load/resource/bitmap/Downsampler;->decodeFromWrappedStreams(Ljava/io/InputStream;Landroid/graphics/BitmapFactory$Options;Lcom/bumptech/glide/load/resource/bitmap/DownsampleStrategy;Lcom/bumptech/glide/load/DecodeFormat;ZIIZLcom/bumptech/glide/load/resource/bitmap/Downsampler$DecodeCallbacks;)Landroid/graphics/Bitmap; PLcom/bumptech/glide/load/resource/bitmap/Downsampler;->decodeStream(Ljava/io/InputStream;Landroid/graphics/BitmapFactory$Options;Lcom/bumptech/glide/load/resource/bitmap/Downsampler$DecodeCallbacks;Lcom/bumptech/glide/load/engine/bitmap_recycle/BitmapPool;)Landroid/graphics/Bitmap; PLcom/bumptech/glide/load/resource/bitmap/Downsampler;->getDimensions(Ljava/io/InputStream;Landroid/graphics/BitmapFactory$Options;Lcom/bumptech/glide/load/resource/bitmap/Downsampler$DecodeCallbacks;Lcom/bumptech/glide/load/engine/bitmap_recycle/BitmapPool;)[I PLcom/bumptech/glide/load/resource/bitmap/Downsampler;->releaseOptions(Landroid/graphics/BitmapFactory$Options;)V PLcom/bumptech/glide/load/resource/bitmap/Downsampler;->resetOptions(Landroid/graphics/BitmapFactory$Options;)V PLcom/bumptech/glide/load/resource/bitmap/DrawableToBitmapConverter$1;->()V PLcom/bumptech/glide/load/resource/bitmap/DrawableTransformation;->(Lcom/bumptech/glide/load/Transformation;Z)V PLcom/bumptech/glide/load/resource/bitmap/DrawableTransformation;->equals(Ljava/lang/Object;)Z PLcom/bumptech/glide/load/resource/bitmap/DrawableTransformation;->hashCode()I PLcom/bumptech/glide/load/resource/bitmap/DrawableTransformation;->transform(Landroid/content/Context;Lcom/bumptech/glide/load/engine/Resource;II)Lcom/bumptech/glide/load/engine/Resource; PLcom/bumptech/glide/load/resource/bitmap/DrawableTransformation;->updateDiskCacheKey(Ljava/security/MessageDigest;)V PLcom/bumptech/glide/load/resource/bitmap/ExifInterfaceImageHeaderParser;->()V PLcom/bumptech/glide/load/resource/bitmap/ExifInterfaceImageHeaderParser;->getOrientation(Ljava/io/InputStream;Lcom/bumptech/glide/load/engine/bitmap_recycle/LruArrayPool;)I PLcom/bumptech/glide/load/resource/bitmap/ExifInterfaceImageHeaderParser;->getType(Ljava/io/InputStream;)Lcom/bumptech/glide/load/ImageHeaderParser$ImageType; PLcom/bumptech/glide/load/resource/bitmap/HardwareConfigState;->()V PLcom/bumptech/glide/load/resource/bitmap/HardwareConfigState;->()V PLcom/bumptech/glide/load/resource/bitmap/RecyclableBufferedInputStream;->(Ljava/io/InputStream;Lcom/bumptech/glide/load/engine/bitmap_recycle/LruArrayPool;)V PLcom/bumptech/glide/load/resource/bitmap/RecyclableBufferedInputStream;->available()I PLcom/bumptech/glide/load/resource/bitmap/RecyclableBufferedInputStream;->fillbuf(Ljava/io/InputStream;[B)I PLcom/bumptech/glide/load/resource/bitmap/RecyclableBufferedInputStream;->mark(I)V PLcom/bumptech/glide/load/resource/bitmap/RecyclableBufferedInputStream;->markSupported()Z PLcom/bumptech/glide/load/resource/bitmap/RecyclableBufferedInputStream;->read()I PLcom/bumptech/glide/load/resource/bitmap/RecyclableBufferedInputStream;->read([BII)I PLcom/bumptech/glide/load/resource/bitmap/RecyclableBufferedInputStream;->release()V PLcom/bumptech/glide/load/resource/bitmap/RecyclableBufferedInputStream;->reset()V PLcom/bumptech/glide/load/resource/bitmap/StreamBitmapDecoder;->(Landroid/content/res/Resources;Lcom/bumptech/glide/load/ResourceDecoder;)V PLcom/bumptech/glide/load/resource/bitmap/StreamBitmapDecoder;->(Ljava/lang/Object;Ljava/lang/Object;I)V PLcom/bumptech/glide/load/resource/bitmap/StreamBitmapDecoder;->decode(Ljava/lang/Object;IILcom/bumptech/glide/load/Options;)Lcom/bumptech/glide/load/engine/Resource; PLcom/bumptech/glide/load/resource/bitmap/StreamBitmapDecoder;->handles(Ljava/lang/Object;Lcom/bumptech/glide/load/Options;)Z PLcom/bumptech/glide/load/resource/bitmap/TransformationUtils$NoLock;->()V PLcom/bumptech/glide/load/resource/bitmap/TransformationUtils$NoLock;->lock()V PLcom/bumptech/glide/load/resource/bitmap/TransformationUtils$NoLock;->unlock()V PLcom/bumptech/glide/load/resource/bitmap/TransformationUtils;->()V PLcom/bumptech/glide/load/resource/bitmap/TransformationUtils;->getAlphaSafeConfig(Landroid/graphics/Bitmap;)Landroid/graphics/Bitmap$Config; PLcom/bumptech/glide/load/resource/bitmap/VideoDecoder$1;->(I)V PLcom/bumptech/glide/load/resource/bitmap/VideoDecoder;->()V PLcom/bumptech/glide/load/resource/bitmap/VideoDecoder;->(Lcom/bumptech/glide/load/engine/bitmap_recycle/BitmapPool;Lcom/bumptech/glide/load/resource/bitmap/VideoDecoder$MediaMetadataRetrieverInitializer;)V PLcom/bumptech/glide/load/resource/drawable/DrawableResource;->(Landroid/graphics/drawable/Drawable;)V PLcom/bumptech/glide/load/resource/drawable/DrawableResource;->get()Ljava/lang/Object; PLcom/bumptech/glide/load/resource/file/FileDecoder;->(I)V PLcom/bumptech/glide/load/resource/gif/ByteBufferGifDecoder;->()V PLcom/bumptech/glide/load/resource/gif/ByteBufferGifDecoder;->(Landroid/content/Context;Ljava/util/List;Lcom/bumptech/glide/load/engine/bitmap_recycle/BitmapPool;Lcom/bumptech/glide/load/engine/bitmap_recycle/LruArrayPool;)V PLcom/bumptech/glide/load/resource/gif/GifDrawableResource;->(Landroid/graphics/drawable/Drawable;I)V PLcom/bumptech/glide/load/resource/gif/GifDrawableResource;->recycle()V PLcom/bumptech/glide/load/resource/gif/GifDrawableTransformation;->(Lcom/bumptech/glide/load/Transformation;)V PLcom/bumptech/glide/load/resource/gif/GifDrawableTransformation;->equals(Ljava/lang/Object;)Z PLcom/bumptech/glide/load/resource/gif/GifDrawableTransformation;->hashCode()I PLcom/bumptech/glide/load/resource/gif/GifDrawableTransformation;->updateDiskCacheKey(Ljava/security/MessageDigest;)V PLcom/bumptech/glide/load/resource/gif/GifFrameResourceDecoder;->(Landroid/content/Context;)V PLcom/bumptech/glide/load/resource/gif/GifFrameResourceDecoder;->(Ljava/lang/Object;I)V PLcom/bumptech/glide/load/resource/gif/GifFrameResourceDecoder;->decode(Landroid/net/Uri;)Lcom/bumptech/glide/load/engine/Resource; PLcom/bumptech/glide/load/resource/gif/GifFrameResourceDecoder;->decode(Ljava/lang/Object;IILcom/bumptech/glide/load/Options;)Lcom/bumptech/glide/load/engine/Resource; PLcom/bumptech/glide/load/resource/gif/GifFrameResourceDecoder;->findContextForPackage(Landroid/net/Uri;Ljava/lang/String;)Landroid/content/Context; PLcom/bumptech/glide/load/resource/gif/GifFrameResourceDecoder;->findResourceIdFromTypeAndNameResourceUri(Landroid/content/Context;Landroid/net/Uri;)I PLcom/bumptech/glide/load/resource/gif/GifFrameResourceDecoder;->findResourceIdFromUri(Landroid/content/Context;Landroid/net/Uri;)I PLcom/bumptech/glide/load/resource/gif/GifFrameResourceDecoder;->handles(Ljava/lang/Object;Lcom/bumptech/glide/load/Options;)Z PLcom/bumptech/glide/load/resource/gif/GifOptions;->()V PLcom/bumptech/glide/load/resource/gif/StreamGifDecoder;->(Ljava/util/List;Lcom/bumptech/glide/load/ResourceDecoder;Lcom/bumptech/glide/load/engine/bitmap_recycle/LruArrayPool;)V PLcom/bumptech/glide/load/resource/gif/StreamGifDecoder;->handles(Ljava/lang/Object;Lcom/bumptech/glide/load/Options;)Z PLcom/bumptech/glide/load/resource/transcode/TranscoderRegistry$Entry;->(Ljava/lang/Class;Ljava/lang/Class;Lcom/bumptech/glide/load/resource/transcode/ResourceTranscoder;)V PLcom/bumptech/glide/load/resource/transcode/TranscoderRegistry$Entry;->handles(Ljava/lang/Class;Ljava/lang/Class;)Z PLcom/bumptech/glide/manager/ActivityFragmentLifecycle;->()V PLcom/bumptech/glide/manager/ActivityFragmentLifecycle;->addListener(Lcom/bumptech/glide/manager/LifecycleListener;)V PLcom/bumptech/glide/manager/ActivityFragmentLifecycle;->onDestroy()V PLcom/bumptech/glide/manager/ActivityFragmentLifecycle;->onStart()V PLcom/bumptech/glide/manager/ActivityFragmentLifecycle;->onStop()V PLcom/bumptech/glide/manager/ActivityFragmentLifecycle;->removeListener(Lcom/bumptech/glide/manager/LifecycleListener;)V PLcom/bumptech/glide/manager/DefaultConnectivityMonitor;->(Landroid/content/Context;Landroidx/compose/runtime/SnapshotThreadLocal;)V PLcom/bumptech/glide/manager/DefaultConnectivityMonitor;->isConnected(Landroid/content/Context;)Z PLcom/bumptech/glide/manager/DefaultConnectivityMonitor;->onDestroy()V PLcom/bumptech/glide/manager/DefaultConnectivityMonitor;->onStart()V PLcom/bumptech/glide/manager/DefaultConnectivityMonitor;->onStop()V PLcom/bumptech/glide/manager/RequestManagerRetriever;->()V PLcom/bumptech/glide/manager/RequestManagerRetriever;->(Lcom/google/android/gms/dynamite/zza;)V PLcom/bumptech/glide/manager/RequestManagerRetriever;->get(Landroid/content/Context;)Lcom/bumptech/glide/RequestManager; PLcom/bumptech/glide/manager/RequestManagerRetriever;->getSupportRequestManagerFragment(Landroidx/fragment/app/FragmentManager;Landroidx/fragment/app/Fragment;Z)Lcom/bumptech/glide/manager/SupportRequestManagerFragment; PLcom/bumptech/glide/manager/RequestManagerRetriever;->handleMessage(Landroid/os/Message;)Z PLcom/bumptech/glide/manager/RequestManagerRetriever;->supportFragmentGet(Landroid/content/Context;Landroidx/fragment/app/FragmentManager;Landroidx/fragment/app/Fragment;Z)Lcom/bumptech/glide/RequestManager; PLcom/bumptech/glide/manager/SupportRequestManagerFragment;->()V PLcom/bumptech/glide/manager/SupportRequestManagerFragment;->onAttach(Landroid/content/Context;)V PLcom/bumptech/glide/manager/SupportRequestManagerFragment;->onDestroy()V PLcom/bumptech/glide/manager/SupportRequestManagerFragment;->onDetach()V PLcom/bumptech/glide/manager/SupportRequestManagerFragment;->onStart()V PLcom/bumptech/glide/manager/SupportRequestManagerFragment;->onStop()V PLcom/bumptech/glide/manager/SupportRequestManagerFragment;->registerFragmentWithRoot(Landroidx/fragment/app/FragmentActivity;)V PLcom/bumptech/glide/manager/SupportRequestManagerFragment;->unregisterFragmentWithRoot()V PLcom/bumptech/glide/manager/TargetTracker;->()V PLcom/bumptech/glide/manager/TargetTracker;->onDestroy()V PLcom/bumptech/glide/manager/TargetTracker;->onStart()V PLcom/bumptech/glide/manager/TargetTracker;->onStop()V PLcom/bumptech/glide/module/ManifestParser;->(Landroid/content/Context;Landroidx/appcompat/R$id$$IA$1;)V PLcom/bumptech/glide/module/ManifestParser;->getFilesDir()Ljava/io/File; PLcom/bumptech/glide/provider/EncoderRegistry$Entry;->(Ljava/lang/Class;Lcom/bumptech/glide/load/Encoder;)V PLcom/bumptech/glide/provider/LoadPathCache;->()V PLcom/bumptech/glide/provider/LoadPathCache;->()V PLcom/bumptech/glide/provider/ResourceDecoderRegistry$Entry;->(Ljava/lang/Class;Ljava/lang/Class;Lcom/bumptech/glide/load/ResourceDecoder;)V PLcom/bumptech/glide/provider/ResourceDecoderRegistry$Entry;->handles(Ljava/lang/Class;Ljava/lang/Class;)Z PLcom/bumptech/glide/provider/ResourceEncoderRegistry$Entry;->(Ljava/lang/Class;Lcom/bumptech/glide/load/ResourceEncoder;)V PLcom/bumptech/glide/provider/ResourceEncoderRegistry;->(I)V PLcom/bumptech/glide/provider/ResourceEncoderRegistry;->get(Ljava/lang/Class;)Lcom/bumptech/glide/load/ResourceEncoder; PLcom/bumptech/glide/provider/ResourceEncoderRegistry;->getTranscodeClasses(Ljava/lang/Class;Ljava/lang/Class;)Ljava/util/List; PLcom/bumptech/glide/request/BaseRequestOptions;->()V PLcom/bumptech/glide/request/BaseRequestOptions;->autoClone()Lcom/bumptech/glide/request/BaseRequestOptions; PLcom/bumptech/glide/request/BaseRequestOptions;->circleCrop()Lcom/bumptech/glide/request/BaseRequestOptions; PLcom/bumptech/glide/request/BaseRequestOptions;->clone()Lcom/bumptech/glide/request/BaseRequestOptions; PLcom/bumptech/glide/request/BaseRequestOptions;->decode(Ljava/lang/Class;)Lcom/bumptech/glide/request/BaseRequestOptions; PLcom/bumptech/glide/request/BaseRequestOptions;->diskCacheStrategy(Lcom/bumptech/glide/load/engine/DiskCacheStrategy;)Lcom/bumptech/glide/request/BaseRequestOptions; PLcom/bumptech/glide/request/BaseRequestOptions;->isSet(II)Z PLcom/bumptech/glide/request/BaseRequestOptions;->placeholder(Landroid/graphics/drawable/Drawable;)Lcom/bumptech/glide/request/BaseRequestOptions; PLcom/bumptech/glide/request/BaseRequestOptions;->priority(Lcom/bumptech/glide/Priority;)Lcom/bumptech/glide/request/BaseRequestOptions; PLcom/bumptech/glide/request/BaseRequestOptions;->selfOrThrowIfLocked()Lcom/bumptech/glide/request/BaseRequestOptions; PLcom/bumptech/glide/request/BaseRequestOptions;->set(Lcom/bumptech/glide/load/Option;Ljava/lang/Object;)Lcom/bumptech/glide/request/BaseRequestOptions; PLcom/bumptech/glide/request/BaseRequestOptions;->skipMemoryCache(Z)Lcom/bumptech/glide/request/BaseRequestOptions; PLcom/bumptech/glide/request/BaseRequestOptions;->transform(Lcom/bumptech/glide/load/Transformation;Z)Lcom/bumptech/glide/request/BaseRequestOptions; PLcom/bumptech/glide/request/BaseRequestOptions;->transform(Lcom/bumptech/glide/load/resource/bitmap/DownsampleStrategy;Lcom/bumptech/glide/load/Transformation;)Lcom/bumptech/glide/request/BaseRequestOptions; PLcom/bumptech/glide/request/BaseRequestOptions;->transform(Ljava/lang/Class;Lcom/bumptech/glide/load/Transformation;Z)Lcom/bumptech/glide/request/BaseRequestOptions; PLcom/bumptech/glide/request/RequestOptions;->()V PLcom/bumptech/glide/request/RequestOptions;->diskCacheStrategyOf(Lcom/bumptech/glide/load/engine/DiskCacheStrategy;)Lcom/bumptech/glide/request/RequestOptions; PLcom/bumptech/glide/request/SingleRequest;->()V PLcom/bumptech/glide/request/SingleRequest;->()V PLcom/bumptech/glide/request/SingleRequest;->assertNotCallingCallbacks()V PLcom/bumptech/glide/request/SingleRequest;->begin()V PLcom/bumptech/glide/request/SingleRequest;->cancel()V PLcom/bumptech/glide/request/SingleRequest;->clear()V PLcom/bumptech/glide/request/SingleRequest;->getPlaceholderDrawable()Landroid/graphics/drawable/Drawable; PLcom/bumptech/glide/request/SingleRequest;->getVerifier()Lcom/bumptech/glide/util/pool/StateVerifier$DefaultStateVerifier; PLcom/bumptech/glide/request/SingleRequest;->isComplete()Z PLcom/bumptech/glide/request/SingleRequest;->isEquivalentTo(Lcom/bumptech/glide/request/Request;)Z PLcom/bumptech/glide/request/SingleRequest;->isFirstReadyResource()Z PLcom/bumptech/glide/request/SingleRequest;->isRunning()Z PLcom/bumptech/glide/request/SingleRequest;->onResourceReady(Lcom/bumptech/glide/load/engine/Resource;Lcom/bumptech/glide/load/DataSource;)V PLcom/bumptech/glide/request/SingleRequest;->onResourceReady(Lcom/bumptech/glide/load/engine/Resource;Ljava/lang/Object;Lcom/bumptech/glide/load/DataSource;)V PLcom/bumptech/glide/request/SingleRequest;->onSizeReady(II)V PLcom/bumptech/glide/request/SingleRequest;->recycle()V PLcom/bumptech/glide/request/SingleRequest;->releaseResource(Lcom/bumptech/glide/load/engine/Resource;)V PLcom/bumptech/glide/request/target/BaseTarget;->()V PLcom/bumptech/glide/request/target/BaseTarget;->getRequest()Lcom/bumptech/glide/request/Request; PLcom/bumptech/glide/request/target/BaseTarget;->onStart()V PLcom/bumptech/glide/request/target/BaseTarget;->onStop()V PLcom/bumptech/glide/request/target/BaseTarget;->setRequest(Lcom/bumptech/glide/request/Request;)V PLcom/bumptech/glide/signature/EmptySignature;->()V PLcom/bumptech/glide/signature/EmptySignature;->()V PLcom/bumptech/glide/signature/EmptySignature;->updateDiskCacheKey(Ljava/security/MessageDigest;)V PLcom/bumptech/glide/signature/ObjectKey;->(Ljava/lang/Object;)V PLcom/bumptech/glide/signature/ObjectKey;->equals(Ljava/lang/Object;)Z PLcom/bumptech/glide/signature/ObjectKey;->hashCode()I PLcom/bumptech/glide/signature/ObjectKey;->updateDiskCacheKey(Ljava/security/MessageDigest;)V PLcom/bumptech/glide/util/CachedHashCodeArrayMap;->()V PLcom/bumptech/glide/util/CachedHashCodeArrayMap;->hashCode()I PLcom/bumptech/glide/util/CachedHashCodeArrayMap;->put(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLcom/bumptech/glide/util/CachedHashCodeArrayMap;->putAll(Landroidx/collection/SimpleArrayMap;)V PLcom/bumptech/glide/util/ExceptionCatchingInputStream;->()V PLcom/bumptech/glide/util/ExceptionCatchingInputStream;->()V PLcom/bumptech/glide/util/ExceptionCatchingInputStream;->available()I PLcom/bumptech/glide/util/ExceptionCatchingInputStream;->mark(I)V PLcom/bumptech/glide/util/ExceptionCatchingInputStream;->markSupported()Z PLcom/bumptech/glide/util/ExceptionCatchingInputStream;->read()I PLcom/bumptech/glide/util/ExceptionCatchingInputStream;->read([BII)I PLcom/bumptech/glide/util/ExceptionCatchingInputStream;->release()V PLcom/bumptech/glide/util/ExceptionCatchingInputStream;->reset()V PLcom/bumptech/glide/util/Executors$1;->(I)V PLcom/bumptech/glide/util/Executors$1;->(Ljava/lang/Object;I)V PLcom/bumptech/glide/util/Executors$1;->execute(Ljava/lang/Runnable;)V PLcom/bumptech/glide/util/Executors;->()V PLcom/bumptech/glide/util/LogTime;->()V PLcom/bumptech/glide/util/LruCache;->(J)V PLcom/bumptech/glide/util/LruCache;->get(Ljava/lang/Object;)Ljava/lang/Object; PLcom/bumptech/glide/util/LruCache;->getSize(Ljava/lang/Object;)I PLcom/bumptech/glide/util/LruCache;->put(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLcom/bumptech/glide/util/LruCache;->trimToSize(J)V PLcom/bumptech/glide/util/MarkEnforcingInputStream;->(Ljava/io/InputStream;)V PLcom/bumptech/glide/util/MarkEnforcingInputStream;->available()I PLcom/bumptech/glide/util/MarkEnforcingInputStream;->getBytesToRead(J)J PLcom/bumptech/glide/util/MarkEnforcingInputStream;->mark(I)V PLcom/bumptech/glide/util/MarkEnforcingInputStream;->read()I PLcom/bumptech/glide/util/MarkEnforcingInputStream;->read([BII)I PLcom/bumptech/glide/util/MarkEnforcingInputStream;->reset()V PLcom/bumptech/glide/util/MarkEnforcingInputStream;->updateAvailableBytesAfterRead(J)V PLcom/bumptech/glide/util/MultiClassKey;->()V PLcom/bumptech/glide/util/MultiClassKey;->(Ljava/lang/Class;Ljava/lang/Class;Ljava/lang/Class;)V PLcom/bumptech/glide/util/MultiClassKey;->equals(Ljava/lang/Object;)Z PLcom/bumptech/glide/util/MultiClassKey;->hashCode()I PLcom/bumptech/glide/util/Util$1;->()V PLcom/bumptech/glide/util/Util;->()V PLcom/bumptech/glide/util/Util;->assertMainThread()V PLcom/bumptech/glide/util/Util;->bothNullOrEqual(Ljava/lang/Object;Ljava/lang/Object;)Z PLcom/bumptech/glide/util/Util;->getBitmapByteSize(IILandroid/graphics/Bitmap$Config;)I PLcom/bumptech/glide/util/Util;->getBitmapByteSize(Landroid/graphics/Bitmap;)I PLcom/bumptech/glide/util/Util;->getSnapshot(Ljava/util/Collection;)Ljava/util/List; PLcom/bumptech/glide/util/Util;->isOnBackgroundThread()Z PLcom/bumptech/glide/util/Util;->isOnMainThread()Z PLcom/bumptech/glide/util/Util;->isValidDimensions(II)Z PLcom/bumptech/glide/util/pool/StateVerifier$DefaultStateVerifier;->()V PLcom/bumptech/glide/util/pool/StateVerifier$DefaultStateVerifier;->throwIfRecycled()V PLcom/firebase/ui/auth/AuthUI;->()V PLcom/firebase/ui/auth/AuthUI;->setApplicationContext(Landroid/content/Context;)V PLcom/firebase/ui/auth/data/client/AuthUiInitProvider;->()V PLcom/firebase/ui/auth/data/client/AuthUiInitProvider;->attachInfo(Landroid/content/Context;Landroid/content/pm/ProviderInfo;)V PLcom/firebase/ui/auth/data/client/AuthUiInitProvider;->onCreate()Z PLcom/firebase/ui/auth/util/Preconditions;->checkNotNull(Ljava/lang/Object;Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/Object; PLcom/google/android/datatransport/Encoding;->(Ljava/lang/String;)V PLcom/google/android/datatransport/Encoding;->equals(Ljava/lang/Object;)Z PLcom/google/android/datatransport/Encoding;->hashCode()I PLcom/google/android/datatransport/Priority;->()V PLcom/google/android/datatransport/Priority;->(Ljava/lang/String;I)V PLcom/google/android/datatransport/Priority;->values()[Lcom/google/android/datatransport/Priority; PLcom/google/android/datatransport/cct/CCTDestination;->()V PLcom/google/android/datatransport/cct/CCTDestination;->(Ljava/lang/String;Ljava/lang/String;)V PLcom/google/android/datatransport/runtime/AutoValue_TransportContext$Builder;->()V PLcom/google/android/datatransport/runtime/AutoValue_TransportContext$Builder;->build()Lcom/google/android/datatransport/runtime/AutoValue_TransportContext; PLcom/google/android/datatransport/runtime/AutoValue_TransportContext$Builder;->setBackendName(Ljava/lang/String;)Lcom/google/android/datatransport/runtime/AutoValue_TransportContext$Builder; PLcom/google/android/datatransport/runtime/AutoValue_TransportContext$Builder;->setPriority(Lcom/google/android/datatransport/Priority;)Lcom/google/android/datatransport/runtime/AutoValue_TransportContext$Builder; PLcom/google/android/datatransport/runtime/AutoValue_TransportContext;->(Ljava/lang/String;[BLcom/google/android/datatransport/Priority;Landroidx/navigation/R$id;)V PLcom/google/android/datatransport/runtime/AutoValue_TransportContext;->builder()Lcom/google/android/datatransport/runtime/AutoValue_TransportContext$Builder; PLcom/google/android/datatransport/runtime/DaggerTransportRuntimeComponent;->(Landroid/content/Context;Landroidx/navigation/R$id;)V PLcom/google/android/datatransport/runtime/ExecutionModule_ExecutorFactory;->()V PLcom/google/android/datatransport/runtime/ExecutionModule_ExecutorFactory;->()V PLcom/google/android/datatransport/runtime/ExecutionModule_ExecutorFactory;->get()Ljava/lang/Object; PLcom/google/android/datatransport/runtime/TransportFactoryImpl;->(Ljava/util/Set;Lcom/google/android/datatransport/runtime/AutoValue_TransportContext;Lcom/google/android/datatransport/runtime/TransportInternal;)V PLcom/google/android/datatransport/runtime/TransportFactoryImpl;->getTransport(Ljava/lang/String;Ljava/lang/Class;Lcom/google/android/datatransport/Encoding;Lcom/google/android/datatransport/Transformer;)Lcom/google/android/datatransport/Transport; PLcom/google/android/datatransport/runtime/TransportImpl;->(Lcom/google/android/datatransport/runtime/AutoValue_TransportContext;Ljava/lang/String;Lcom/google/android/datatransport/Encoding;Lcom/google/android/datatransport/Transformer;Lcom/google/android/datatransport/runtime/TransportInternal;)V PLcom/google/android/datatransport/runtime/TransportRuntime;->(Lcom/google/android/datatransport/runtime/time/Clock;Lcom/google/android/datatransport/runtime/time/Clock;Lcom/google/android/datatransport/runtime/scheduling/Scheduler;Lcom/google/android/datatransport/runtime/scheduling/jobscheduling/Uploader;Lcom/google/android/datatransport/runtime/scheduling/jobscheduling/WorkInitializer;)V PLcom/google/android/datatransport/runtime/TransportRuntime;->getInstance()Lcom/google/android/datatransport/runtime/TransportRuntime; PLcom/google/android/datatransport/runtime/TransportRuntime;->initialize(Landroid/content/Context;)V PLcom/google/android/datatransport/runtime/TransportRuntime;->newFactory(Lcom/google/android/datatransport/runtime/EncodedDestination;)Lcom/google/android/datatransport/TransportFactory; PLcom/google/android/datatransport/runtime/TransportRuntime_Factory;->(Ljavax/inject/Provider;Ljavax/inject/Provider;Ljavax/inject/Provider;Ljavax/inject/Provider;Ljavax/inject/Provider;)V PLcom/google/android/datatransport/runtime/TransportRuntime_Factory;->get()Ljava/lang/Object; PLcom/google/android/datatransport/runtime/backends/AutoValue_BackendRequest$Builder;->(Landroid/content/Context;)V PLcom/google/android/datatransport/runtime/backends/CreationContextFactory;->(Landroid/content/Context;Lcom/google/android/datatransport/runtime/time/Clock;Lcom/google/android/datatransport/runtime/time/Clock;)V PLcom/google/android/datatransport/runtime/backends/CreationContextFactory_Factory;->(Ljavax/inject/Provider;Ljavax/inject/Provider;Ljavax/inject/Provider;I)V PLcom/google/android/datatransport/runtime/backends/CreationContextFactory_Factory;->get()Ljava/lang/Object; PLcom/google/android/datatransport/runtime/backends/MetadataBackendRegistry;->(Landroid/content/Context;Lcom/google/android/datatransport/runtime/backends/CreationContextFactory;)V PLcom/google/android/datatransport/runtime/backends/MetadataBackendRegistry_Factory;->(Ljavax/inject/Provider;Ljavax/inject/Provider;)V PLcom/google/android/datatransport/runtime/backends/MetadataBackendRegistry_Factory;->get()Ljava/lang/Object; PLcom/google/android/datatransport/runtime/scheduling/DefaultScheduler;->()V PLcom/google/android/datatransport/runtime/scheduling/DefaultScheduler;->(Ljava/util/concurrent/Executor;Lcom/google/android/datatransport/runtime/backends/MetadataBackendRegistry;Lcom/google/android/datatransport/runtime/scheduling/jobscheduling/WorkScheduler;Lcom/google/android/datatransport/runtime/scheduling/persistence/EventStore;Lcom/google/android/datatransport/runtime/synchronization/SynchronizationGuard;)V PLcom/google/android/datatransport/runtime/scheduling/DefaultScheduler_Factory;->(Ljavax/inject/Provider;Ljavax/inject/Provider;Ljavax/inject/Provider;Ljavax/inject/Provider;Ljavax/inject/Provider;)V PLcom/google/android/datatransport/runtime/scheduling/DefaultScheduler_Factory;->get()Ljava/lang/Object; PLcom/google/android/datatransport/runtime/scheduling/SchedulingConfigModule_ConfigFactory;->(Ljavax/inject/Provider;)V PLcom/google/android/datatransport/runtime/scheduling/SchedulingConfigModule_ConfigFactory;->get()Ljava/lang/Object; PLcom/google/android/datatransport/runtime/scheduling/jobscheduling/AutoValue_SchedulerConfig;->(Lcom/google/android/datatransport/runtime/time/Clock;Ljava/util/Map;)V PLcom/google/android/datatransport/runtime/scheduling/jobscheduling/AutoValue_SchedulerConfig_ConfigValue$Builder;->()V PLcom/google/android/datatransport/runtime/scheduling/jobscheduling/AutoValue_SchedulerConfig_ConfigValue$Builder;->build()Lcom/google/android/datatransport/runtime/scheduling/jobscheduling/AutoValue_SchedulerConfig_ConfigValue; PLcom/google/android/datatransport/runtime/scheduling/jobscheduling/AutoValue_SchedulerConfig_ConfigValue$Builder;->setDelta(J)Lcom/google/android/datatransport/runtime/scheduling/jobscheduling/AutoValue_SchedulerConfig_ConfigValue$Builder; PLcom/google/android/datatransport/runtime/scheduling/jobscheduling/AutoValue_SchedulerConfig_ConfigValue$Builder;->setMaxAllowedDelay(J)Lcom/google/android/datatransport/runtime/scheduling/jobscheduling/AutoValue_SchedulerConfig_ConfigValue$Builder; PLcom/google/android/datatransport/runtime/scheduling/jobscheduling/AutoValue_SchedulerConfig_ConfigValue;->(JJLjava/util/Set;Landroidx/core/R$id;)V PLcom/google/android/datatransport/runtime/scheduling/jobscheduling/AutoValue_SchedulerConfig_ConfigValue;->builder()Lcom/google/android/datatransport/runtime/scheduling/jobscheduling/AutoValue_SchedulerConfig_ConfigValue$Builder; PLcom/google/android/datatransport/runtime/scheduling/jobscheduling/JobInfoScheduler;->(Landroid/content/Context;Lcom/google/android/datatransport/runtime/scheduling/persistence/EventStore;Lcom/google/android/datatransport/runtime/scheduling/jobscheduling/AutoValue_SchedulerConfig;)V PLcom/google/android/datatransport/runtime/scheduling/jobscheduling/SchedulerConfig$Flag;->()V PLcom/google/android/datatransport/runtime/scheduling/jobscheduling/SchedulerConfig$Flag;->(Ljava/lang/String;I)V PLcom/google/android/datatransport/runtime/scheduling/jobscheduling/Uploader;->(Landroid/content/Context;Lcom/google/android/datatransport/runtime/backends/MetadataBackendRegistry;Lcom/google/android/datatransport/runtime/scheduling/persistence/EventStore;Lcom/google/android/datatransport/runtime/scheduling/jobscheduling/WorkScheduler;Ljava/util/concurrent/Executor;Lcom/google/android/datatransport/runtime/synchronization/SynchronizationGuard;Lcom/google/android/datatransport/runtime/time/Clock;)V PLcom/google/android/datatransport/runtime/scheduling/jobscheduling/Uploader_Factory;->(Ljavax/inject/Provider;Ljavax/inject/Provider;Ljavax/inject/Provider;Ljavax/inject/Provider;Ljavax/inject/Provider;Ljavax/inject/Provider;Ljavax/inject/Provider;)V PLcom/google/android/datatransport/runtime/scheduling/jobscheduling/Uploader_Factory;->get()Ljava/lang/Object; PLcom/google/android/datatransport/runtime/scheduling/jobscheduling/WorkInitializer;->(Ljava/util/concurrent/Executor;Lcom/google/android/datatransport/runtime/scheduling/persistence/EventStore;Lcom/google/android/datatransport/runtime/scheduling/jobscheduling/WorkScheduler;Lcom/google/android/datatransport/runtime/synchronization/SynchronizationGuard;)V PLcom/google/android/datatransport/runtime/scheduling/persistence/AutoValue_EventStoreConfig;->()V PLcom/google/android/datatransport/runtime/scheduling/persistence/AutoValue_EventStoreConfig;->(JIIJILandroidx/room/Room;)V PLcom/google/android/datatransport/runtime/scheduling/persistence/EventStoreModule_DbNameFactory;->()V PLcom/google/android/datatransport/runtime/scheduling/persistence/EventStoreModule_DbNameFactory;->()V PLcom/google/android/datatransport/runtime/scheduling/persistence/EventStoreModule_DbNameFactory;->get()Ljava/lang/Object; PLcom/google/android/datatransport/runtime/scheduling/persistence/EventStoreModule_SchemaVersionFactory;->()V PLcom/google/android/datatransport/runtime/scheduling/persistence/EventStoreModule_SchemaVersionFactory;->()V PLcom/google/android/datatransport/runtime/scheduling/persistence/EventStoreModule_SchemaVersionFactory;->get()Ljava/lang/Object; PLcom/google/android/datatransport/runtime/scheduling/persistence/EventStoreModule_StoreConfigFactory;->()V PLcom/google/android/datatransport/runtime/scheduling/persistence/EventStoreModule_StoreConfigFactory;->()V PLcom/google/android/datatransport/runtime/scheduling/persistence/EventStoreModule_StoreConfigFactory;->get()Ljava/lang/Object; PLcom/google/android/datatransport/runtime/scheduling/persistence/SQLiteEventStore;->()V PLcom/google/android/datatransport/runtime/scheduling/persistence/SQLiteEventStore;->(Lcom/google/android/datatransport/runtime/time/Clock;Lcom/google/android/datatransport/runtime/time/Clock;Lcom/google/android/datatransport/runtime/scheduling/persistence/AutoValue_EventStoreConfig;Lcom/google/android/datatransport/runtime/scheduling/persistence/SchemaManager;)V PLcom/google/android/datatransport/runtime/scheduling/persistence/SQLiteEventStore;->getDb()Landroid/database/sqlite/SQLiteDatabase; PLcom/google/android/datatransport/runtime/scheduling/persistence/SQLiteEventStore;->runCriticalSection(Lcom/google/android/datatransport/runtime/synchronization/SynchronizationGuard$CriticalSection;)Ljava/lang/Object; PLcom/google/android/datatransport/runtime/scheduling/persistence/SQLiteEventStore_Factory;->(Ljavax/inject/Provider;Ljavax/inject/Provider;Ljavax/inject/Provider;Ljavax/inject/Provider;I)V PLcom/google/android/datatransport/runtime/scheduling/persistence/SQLiteEventStore_Factory;->get()Ljava/lang/Object; PLcom/google/android/datatransport/runtime/scheduling/persistence/SchemaManager$$Lambda$1;->()V PLcom/google/android/datatransport/runtime/scheduling/persistence/SchemaManager$$Lambda$1;->()V PLcom/google/android/datatransport/runtime/scheduling/persistence/SchemaManager$$Lambda$2;->()V PLcom/google/android/datatransport/runtime/scheduling/persistence/SchemaManager$$Lambda$2;->()V PLcom/google/android/datatransport/runtime/scheduling/persistence/SchemaManager$$Lambda$3;->()V PLcom/google/android/datatransport/runtime/scheduling/persistence/SchemaManager$$Lambda$3;->()V PLcom/google/android/datatransport/runtime/scheduling/persistence/SchemaManager$$Lambda$4;->()V PLcom/google/android/datatransport/runtime/scheduling/persistence/SchemaManager$$Lambda$4;->()V PLcom/google/android/datatransport/runtime/scheduling/persistence/SchemaManager;->()V PLcom/google/android/datatransport/runtime/scheduling/persistence/SchemaManager;->(Landroid/content/Context;Ljava/lang/String;I)V PLcom/google/android/datatransport/runtime/scheduling/persistence/SchemaManager;->onConfigure(Landroid/database/sqlite/SQLiteDatabase;)V PLcom/google/android/datatransport/runtime/scheduling/persistence/SchemaManager;->onOpen(Landroid/database/sqlite/SQLiteDatabase;)V PLcom/google/android/datatransport/runtime/time/TimeModule_EventClockFactory;->()V PLcom/google/android/datatransport/runtime/time/TimeModule_EventClockFactory;->()V PLcom/google/android/datatransport/runtime/time/TimeModule_EventClockFactory;->get()Ljava/lang/Object; PLcom/google/android/datatransport/runtime/time/TimeModule_UptimeClockFactory;->()V PLcom/google/android/datatransport/runtime/time/TimeModule_UptimeClockFactory;->()V PLcom/google/android/datatransport/runtime/time/TimeModule_UptimeClockFactory;->get()Ljava/lang/Object; PLcom/google/android/datatransport/runtime/time/UptimeClock;->(I)V PLcom/google/android/datatransport/runtime/time/UptimeClock;->getTime()J PLcom/google/android/flexbox/FlexboxHelper;->(Lcom/google/android/flexbox/FlexContainer;)V PLcom/google/android/flexbox/FlexboxHelper;->expandFlexItems(IILcom/google/android/flexbox/FlexLine;IIZ)V PLcom/google/android/flexbox/FlexboxHelper;->extractHigherInt(J)I PLcom/google/android/flexbox/FlexboxHelper;->getFlexItemMarginStartCross(Lcom/google/android/flexbox/FlexItem;Z)I PLcom/google/android/flexbox/FlexboxHelper;->isLastFlexItem(IILcom/google/android/flexbox/FlexLine;)Z PLcom/google/android/flexbox/FlexboxLayoutManager$AnchorInfo;->(Lcom/google/android/flexbox/FlexboxLayoutManager;Landroidx/room/Room;)V PLcom/google/android/flexbox/FlexboxLayoutManager$LayoutParams;->()V PLcom/google/android/flexbox/FlexboxLayoutManager$LayoutState;->(Landroidx/room/Room;)V PLcom/google/android/flexbox/FlexboxLayoutManager;->()V PLcom/google/android/flexbox/FlexboxLayoutManager;->clearFlexLines()V PLcom/google/android/flexbox/FlexboxLayoutManager;->computeVerticalScrollExtent(Landroidx/recyclerview/widget/RecyclerView$State;)I PLcom/google/android/flexbox/FlexboxLayoutManager;->computeVerticalScrollOffset(Landroidx/recyclerview/widget/RecyclerView$State;)I PLcom/google/android/flexbox/FlexboxLayoutManager;->computeVerticalScrollRange(Landroidx/recyclerview/widget/RecyclerView$State;)I PLcom/google/android/flexbox/FlexboxLayoutManager;->findLastReferenceChild(I)Landroid/view/View; PLcom/google/android/flexbox/FlexboxLayoutManager;->findLastVisibleItemPosition()I PLcom/google/android/flexbox/FlexboxLayoutManager;->generateLayoutParams(Landroid/content/Context;Landroid/util/AttributeSet;)Landroidx/recyclerview/widget/RecyclerView$LayoutParams; PLcom/google/android/flexbox/FlexboxLayoutManager;->onAdapterChanged(Landroidx/recyclerview/widget/RecyclerView$Adapter;Landroidx/recyclerview/widget/RecyclerView$Adapter;)V PLcom/google/android/flexbox/FlexboxLayoutManager;->onNewFlexLineAdded(Lcom/google/android/flexbox/FlexLine;)V PLcom/google/android/flexbox/FlexboxLayoutManager;->setFlexDirection(I)V PLcom/google/android/flexbox/FlexboxLayoutManager;->setFlexWrap(I)V PLcom/google/android/gms/ads/identifier/AdvertisingIdClient;->(Landroid/content/Context;JZZ)V PLcom/google/android/gms/ads/identifier/AdvertisingIdClient;->finalize()V PLcom/google/android/gms/ads/identifier/AdvertisingIdClient;->finish()V PLcom/google/android/gms/ads/identifier/AdvertisingIdClient;->getAdvertisingIdInfo(Landroid/content/Context;)Landroidx/room/RoomOpenHelper$ValidationResult; PLcom/google/android/gms/ads/identifier/AdvertisingIdClient;->zza(Landroid/content/Context;Z)Lcom/google/android/gms/common/BlockingServiceConnection; PLcom/google/android/gms/ads/identifier/AdvertisingIdClient;->zza(Landroidx/room/RoomOpenHelper$ValidationResult;ZFJLjava/lang/String;Ljava/lang/Throwable;)Z PLcom/google/android/gms/ads/identifier/AdvertisingIdClient;->zza(Z)V PLcom/google/android/gms/ads/identifier/zza;->(Lcom/bumptech/glide/load/engine/executor/GlideExecutor$DefaultThreadFactory;Ljava/lang/Runnable;Ljava/lang/String;)V PLcom/google/android/gms/ads/identifier/zza;->run()V PLcom/google/android/gms/common/ConnectionResult;->()V PLcom/google/android/gms/common/ConnectionResult;->(I)V PLcom/google/android/gms/common/ConnectionResult;->(ILandroid/app/PendingIntent;)V PLcom/google/android/gms/common/Feature;->()V PLcom/google/android/gms/common/Feature;->(Ljava/lang/String;J)V PLcom/google/android/gms/common/GoogleApiAvailability;->()V PLcom/google/android/gms/common/GoogleApiAvailability;->()V PLcom/google/android/gms/common/GoogleApiAvailability;->isGooglePlayServicesAvailable(Landroid/content/Context;I)I PLcom/google/android/gms/common/GoogleApiAvailabilityLight;->()V PLcom/google/android/gms/common/GoogleApiAvailabilityLight;->()V PLcom/google/android/gms/common/GoogleApiAvailabilityLight;->isGooglePlayServicesAvailable(Landroid/content/Context;I)I PLcom/google/android/gms/common/GooglePlayServicesNotAvailableException;->(I)V PLcom/google/android/gms/common/GooglePlayServicesUtilLight;->()V PLcom/google/android/gms/common/GooglePlayServicesUtilLight;->isGooglePlayServicesAvailable(Landroid/content/Context;I)I PLcom/google/android/gms/common/GooglePlayServicesUtilLight;->isPlayServicesPossiblyUpdating(Landroid/content/Context;I)Z PLcom/google/android/gms/common/api/Api$AbstractClientBuilder;->()V PLcom/google/android/gms/common/api/Api$AnyClientKey;->()V PLcom/google/android/gms/common/api/Api$ClientKey;->()V PLcom/google/android/gms/common/api/Api;->(Ljava/lang/String;Lcom/google/android/gms/common/api/Api$AbstractClientBuilder;Lcom/google/android/gms/common/api/Api$ClientKey;)V PLcom/google/android/gms/common/api/GoogleApi$Settings;->()V PLcom/google/android/gms/common/api/GoogleApi;->(Landroid/content/Context;Lcom/google/android/gms/common/api/Api;Lcom/google/android/gms/common/api/Api$ApiOptions;Lcom/google/android/gms/common/api/internal/StatusExceptionMapper;)V PLcom/google/android/gms/common/api/GoogleApi;->createClientSettingsBuilder()Lcom/google/android/gms/common/internal/ClientSettings$Builder; PLcom/google/android/gms/common/api/GoogleApi;->zaa(Landroid/os/Looper;Lcom/google/android/gms/common/api/internal/GoogleApiManager$zaa;)Lcom/google/android/gms/common/api/Api$Client; PLcom/google/android/gms/common/api/GoogleApiClient;->()V PLcom/google/android/gms/common/api/GoogleApiClient;->()V PLcom/google/android/gms/common/api/Status;->()V PLcom/google/android/gms/common/api/Status;->(I)V PLcom/google/android/gms/common/api/Status;->(IILjava/lang/String;Landroid/app/PendingIntent;)V PLcom/google/android/gms/common/api/Status;->(ILjava/lang/String;)V PLcom/google/android/gms/common/api/Status;->isSuccess()Z PLcom/google/android/gms/common/api/internal/ApiKey;->(Lcom/google/android/gms/common/api/Api;Lcom/google/android/gms/common/api/Api$ApiOptions;)V PLcom/google/android/gms/common/api/internal/ApiKey;->hashCode()I PLcom/google/android/gms/common/api/internal/BackgroundDetector;->()V PLcom/google/android/gms/common/api/internal/BackgroundDetector;->()V PLcom/google/android/gms/common/api/internal/BackgroundDetector;->addListener(Lcom/google/android/gms/common/api/internal/BackgroundDetector$BackgroundStateChangeListener;)V PLcom/google/android/gms/common/api/internal/BackgroundDetector;->initialize(Landroid/app/Application;)V PLcom/google/android/gms/common/api/internal/BackgroundDetector;->onActivityCreated(Landroid/app/Activity;Landroid/os/Bundle;)V PLcom/google/android/gms/common/api/internal/BackgroundDetector;->onActivityDestroyed(Landroid/app/Activity;)V PLcom/google/android/gms/common/api/internal/BackgroundDetector;->onActivityPaused(Landroid/app/Activity;)V PLcom/google/android/gms/common/api/internal/BackgroundDetector;->onActivityResumed(Landroid/app/Activity;)V PLcom/google/android/gms/common/api/internal/BackgroundDetector;->onActivitySaveInstanceState(Landroid/app/Activity;Landroid/os/Bundle;)V PLcom/google/android/gms/common/api/internal/BackgroundDetector;->onActivityStarted(Landroid/app/Activity;)V PLcom/google/android/gms/common/api/internal/BackgroundDetector;->onActivityStopped(Landroid/app/Activity;)V PLcom/google/android/gms/common/api/internal/BackgroundDetector;->onBackgroundStateChanged(Z)V PLcom/google/android/gms/common/api/internal/BackgroundDetector;->onTrimMemory(I)V PLcom/google/android/gms/common/api/internal/GoogleApiManager$zaa;->(Lcom/google/android/gms/common/api/internal/GoogleApiManager;Lcom/google/android/gms/common/api/GoogleApi;)V PLcom/google/android/gms/common/api/internal/GoogleApiManager$zaa;->connect()V PLcom/google/android/gms/common/api/internal/GoogleApiManager$zaa;->onConnectionFailed(Lcom/google/android/gms/common/ConnectionResult;)V PLcom/google/android/gms/common/api/internal/GoogleApiManager$zaa;->requiresSignIn()Z PLcom/google/android/gms/common/api/internal/GoogleApiManager$zaa;->zabj()V PLcom/google/android/gms/common/api/internal/GoogleApiManager$zaa;->zai(Lcom/google/android/gms/common/ConnectionResult;)V PLcom/google/android/gms/common/api/internal/GoogleApiManager;->()V PLcom/google/android/gms/common/api/internal/GoogleApiManager;->(Landroid/content/Context;Landroid/os/Looper;Lcom/google/android/gms/common/GoogleApiAvailability;)V PLcom/google/android/gms/common/api/internal/GoogleApiManager;->handleMessage(Landroid/os/Message;)Z PLcom/google/android/gms/common/api/internal/GoogleApiManager;->zab(Landroid/content/Context;)Lcom/google/android/gms/common/api/internal/GoogleApiManager; PLcom/google/android/gms/common/api/internal/GoogleApiManager;->zab(Lcom/google/android/gms/common/api/GoogleApi;)V PLcom/google/android/gms/common/api/internal/GoogleApiManager;->zabb()I PLcom/google/android/gms/common/api/internal/GoogleServices;->()V PLcom/google/android/gms/common/api/internal/GoogleServices;->(Landroid/content/Context;)V PLcom/google/android/gms/common/api/internal/zabn;->(Lcom/google/android/gms/common/api/GoogleApi;)V PLcom/google/android/gms/common/internal/BaseGmsClient$zzb;->(Lcom/google/android/gms/common/internal/BaseGmsClient;Landroid/os/Looper;)V PLcom/google/android/gms/common/internal/BaseGmsClient;->()V PLcom/google/android/gms/common/internal/BaseGmsClient;->(Landroid/content/Context;Landroid/os/Looper;Lcom/google/android/gms/common/internal/zze;Lcom/google/android/gms/common/GoogleApiAvailabilityLight;ILcom/google/android/gms/common/internal/BaseGmsClient$BaseConnectionCallbacks;Lcom/google/android/gms/common/internal/BaseGmsClient$BaseOnConnectionFailedListener;Ljava/lang/String;)V PLcom/google/android/gms/common/internal/BaseGmsClient;->isConnected()Z PLcom/google/android/gms/common/internal/BaseGmsClient;->isConnecting()Z PLcom/google/android/gms/common/internal/BaseGmsClient;->requiresSignIn()Z PLcom/google/android/gms/common/internal/ClientSettings$Builder;->()V PLcom/google/android/gms/common/internal/ClientSettings$Builder;->build()Lcom/google/android/gms/common/internal/ClientSettings; PLcom/google/android/gms/common/internal/ClientSettings;->(Landroid/accounts/Account;Ljava/util/Set;Ljava/util/Map;ILandroid/view/View;Ljava/lang/String;Ljava/lang/String;Lcom/google/android/gms/signin/SignInOptions;Z)V PLcom/google/android/gms/common/internal/GmsClient;->(Landroid/content/Context;Landroid/os/Looper;ILcom/google/android/gms/common/internal/ClientSettings;Lcom/google/android/gms/common/api/internal/ConnectionCallbacks;Lcom/google/android/gms/common/api/internal/OnConnectionFailedListener;)V PLcom/google/android/gms/common/internal/GmsLogger;->(Ljava/lang/String;Ljava/lang/String;)V PLcom/google/android/gms/common/internal/safeparcel/AbstractSafeParcelable;->()V PLcom/google/android/gms/common/internal/zaf;->(Lcom/google/android/gms/common/api/internal/ConnectionCallbacks;)V PLcom/google/android/gms/common/internal/zag;->(Lcom/google/android/gms/common/api/internal/OnConnectionFailedListener;)V PLcom/google/android/gms/common/internal/zze;->()V PLcom/google/android/gms/common/internal/zze;->(Landroid/content/Context;)V PLcom/google/android/gms/common/internal/zze;->getInstance(Landroid/content/Context;)Lcom/google/android/gms/common/internal/zze; PLcom/google/android/gms/common/internal/zzp;->()V PLcom/google/android/gms/common/internal/zzp;->zze(Landroid/content/Context;)V PLcom/google/android/gms/common/logging/Logger;->(Ljava/lang/String;[Ljava/lang/String;)V PLcom/google/android/gms/common/stats/ConnectionTracker;->()V PLcom/google/android/gms/common/stats/ConnectionTracker;->()V PLcom/google/android/gms/common/stats/ConnectionTracker;->getInstance()Lcom/google/android/gms/common/stats/ConnectionTracker; PLcom/google/android/gms/common/stats/ConnectionTracker;->zza(Landroid/content/Context;Landroid/content/Intent;Landroid/content/ServiceConnection;I)Z PLcom/google/android/gms/common/util/Strings;->()V PLcom/google/android/gms/common/util/Strings;->isEmptyOrWhitespace(Ljava/lang/String;)Z PLcom/google/android/gms/common/util/concurrent/NamedThreadFactory;->(Ljava/lang/String;)V PLcom/google/android/gms/common/util/concurrent/NamedThreadFactory;->newThread(Ljava/lang/Runnable;)Ljava/lang/Thread; PLcom/google/android/gms/common/wrappers/Wrappers;->()V PLcom/google/android/gms/common/wrappers/Wrappers;->()V PLcom/google/android/gms/common/zza;->(I)V PLcom/google/android/gms/dynamic/ObjectWrapper;->(Ljava/lang/Object;)V PLcom/google/android/gms/dynamic/ObjectWrapper;->unwrap(Lcom/google/android/gms/dynamic/IObjectWrapper;)Ljava/lang/Object; PLcom/google/android/gms/dynamite/DynamiteModule$LoadingException;->(Ljava/lang/String;Lcom/google/android/gms/dynamite/zza;)V PLcom/google/android/gms/dynamite/DynamiteModule$VersionPolicy$zzb;->()V PLcom/google/android/gms/dynamite/DynamiteModule$zza;->(Lcom/google/android/gms/dynamite/zza;)V PLcom/google/android/gms/dynamite/DynamiteModule;->()V PLcom/google/android/gms/dynamite/DynamiteModule;->(Landroid/content/Context;)V PLcom/google/android/gms/dynamite/DynamiteModule;->getLocalVersion(Landroid/content/Context;Ljava/lang/String;)I PLcom/google/android/gms/dynamite/DynamiteModule;->instantiate(Ljava/lang/String;)Landroid/os/IBinder; PLcom/google/android/gms/dynamite/DynamiteModule;->load(Landroid/content/Context;Lcom/google/android/gms/dynamite/DynamiteModule$VersionPolicy;Ljava/lang/String;)Lcom/google/android/gms/dynamite/DynamiteModule; PLcom/google/android/gms/dynamite/DynamiteModule;->zza(Landroid/content/Context;Ljava/lang/String;Z)I PLcom/google/android/gms/dynamite/DynamiteModule;->zzb(Landroid/content/Context;Ljava/lang/String;Z)I PLcom/google/android/gms/dynamite/DynamiteModule;->zzc(Landroid/content/Context;Ljava/lang/String;Z)I PLcom/google/android/gms/dynamite/DynamiteModule;->zze(Landroid/content/Context;Ljava/lang/String;)Lcom/google/android/gms/dynamite/DynamiteModule; PLcom/google/android/gms/dynamite/DynamiteModule;->zzj(Landroid/content/Context;)Lcom/google/android/gms/dynamite/zzj; PLcom/google/android/gms/dynamite/zza;->(I)V PLcom/google/android/gms/dynamite/zza;->(Lcom/bumptech/glide/load/resource/bitmap/VideoDecoder$1;)V PLcom/google/android/gms/dynamite/zza;->(Lcom/google/android/gms/auth/api/signin/zzd;)V PLcom/google/android/gms/dynamite/zza;->create()Ljava/lang/Object; PLcom/google/android/gms/dynamite/zza;->getLocalVersion(Landroid/content/Context;Ljava/lang/String;)I PLcom/google/android/gms/dynamite/zza;->zza(Landroid/content/Context;Ljava/lang/String;Lcom/google/android/gms/dynamite/DynamiteModule$VersionPolicy$zza;)Lcom/google/android/gms/dynamite/DynamiteModule$VersionPolicy$zzb; PLcom/google/android/gms/internal/base/zar;->(Landroid/os/Looper;Landroid/os/Handler$Callback;)V PLcom/google/android/gms/internal/base/zar;->dispatchMessage(Landroid/os/Message;)V PLcom/google/android/gms/internal/clearcut/zzac;->(Ljava/lang/Object;I)V PLcom/google/android/gms/internal/clearcut/zzao;->(Lcom/google/firebase/iid/FirebaseInstanceId;Lcom/google/firebase/events/Subscriber;)V PLcom/google/android/gms/internal/clearcut/zzao;->zza()Z PLcom/google/android/gms/internal/clearcut/zzao;->zzb()V PLcom/google/android/gms/internal/clearcut/zzao;->zzc()Ljava/lang/Boolean; PLcom/google/android/gms/internal/clearcut/zzao;->zzd()Z PLcom/google/android/gms/internal/clearcut/zzay;->(Lcom/google/android/gms/internal/measurement/zzer;)V PLcom/google/android/gms/internal/common/zzb;->(Ljava/lang/String;)V PLcom/google/android/gms/internal/common/zze;->(Landroid/os/Looper;)V PLcom/google/android/gms/internal/common/zze;->(Landroid/os/Looper;Landroid/os/Handler$Callback;)V PLcom/google/android/gms/internal/firebase_auth/zzbg;->()V PLcom/google/android/gms/internal/firebase_auth/zzbg;->()V PLcom/google/android/gms/internal/firebase_auth/zzbh;->()V PLcom/google/android/gms/internal/firebase_auth/zzbh;->()V PLcom/google/android/gms/internal/firebase_auth/zzbj;->(Lcom/google/android/gms/internal/firebase_auth/zzbg;I)V PLcom/google/android/gms/internal/firebase_auth/zzbm;->()V PLcom/google/android/gms/internal/firebase_auth/zzbm;->([Ljava/lang/Object;I)V PLcom/google/android/gms/internal/firebase_auth/zzbm;->size()I PLcom/google/android/gms/internal/firebase_auth/zzbu;->()V PLcom/google/android/gms/internal/firebase_auth/zzj;->(Landroid/os/Looper;)V PLcom/google/android/gms/internal/firebase_messaging/zze;->(Landroid/os/Looper;)V PLcom/google/android/gms/internal/measurement/zzaa;->(Lcom/google/android/gms/internal/measurement/zzz;Landroid/app/Activity;Ljava/lang/String;Ljava/lang/String;)V PLcom/google/android/gms/internal/measurement/zzaa;->zza()V PLcom/google/android/gms/internal/measurement/zzaf;->(Lcom/google/android/gms/internal/measurement/zzz;ZI)V PLcom/google/android/gms/internal/measurement/zzaf;->zza()V PLcom/google/android/gms/internal/measurement/zzar;->(Lcom/google/android/gms/internal/measurement/zzz;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Object;Z)V PLcom/google/android/gms/internal/measurement/zzar;->zza()V PLcom/google/android/gms/internal/measurement/zzas;->(Lcom/google/android/gms/measurement/internal/zzhw;Landroid/app/Activity;Landroid/os/Bundle;)V PLcom/google/android/gms/internal/measurement/zzas;->(Lcom/google/android/gms/measurement/internal/zzhw;Landroid/app/Activity;Lcom/google/android/gms/internal/measurement/zzl;)V PLcom/google/android/gms/internal/measurement/zzas;->zza()V PLcom/google/android/gms/internal/measurement/zzau;->(Lcom/google/android/gms/internal/measurement/zzz;Ljava/lang/Object;I)V PLcom/google/android/gms/internal/measurement/zzau;->zza()V PLcom/google/android/gms/internal/measurement/zzay;->(Lcom/google/android/gms/internal/measurement/zzz;Ljava/lang/Long;Ljava/lang/String;Ljava/lang/String;Landroid/os/Bundle;ZZ)V PLcom/google/android/gms/internal/measurement/zzay;->zza()V PLcom/google/android/gms/internal/measurement/zzbc;->(Lcom/google/android/gms/measurement/internal/zzhw;Landroid/app/Activity;I)V PLcom/google/android/gms/internal/measurement/zzbc;->zza()V PLcom/google/android/gms/internal/measurement/zzbp;->()V PLcom/google/android/gms/internal/measurement/zzbq$zza$zza;->(Lcom/google/android/gms/internal/measurement/zzbp;)V PLcom/google/android/gms/internal/measurement/zzbq$zza$zza;->zza()Ljava/lang/String; PLcom/google/android/gms/internal/measurement/zzbq$zza;->()V PLcom/google/android/gms/internal/measurement/zzbq$zza;->()V PLcom/google/android/gms/internal/measurement/zzbq$zza;->zza()Ljava/lang/String; PLcom/google/android/gms/internal/measurement/zzbq$zza;->zza(ILjava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLcom/google/android/gms/internal/measurement/zzbq$zza;->zzb()Z PLcom/google/android/gms/internal/measurement/zzbq$zza;->zzc()Z PLcom/google/android/gms/internal/measurement/zzbq$zza;->zzd()Z PLcom/google/android/gms/internal/measurement/zzbq$zza;->zzf()Lcom/google/android/gms/internal/measurement/zzbq$zza; PLcom/google/android/gms/internal/measurement/zzbq$zzb$zza;->(Lcom/google/android/gms/internal/measurement/zzbp;)V PLcom/google/android/gms/internal/measurement/zzbq$zzb;->()V PLcom/google/android/gms/internal/measurement/zzbq$zzb;->()V PLcom/google/android/gms/internal/measurement/zzbq$zzb;->zza()Z PLcom/google/android/gms/internal/measurement/zzbq$zzb;->zza(I)Lcom/google/android/gms/internal/measurement/zzbq$zza; PLcom/google/android/gms/internal/measurement/zzbq$zzb;->zza(ILjava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLcom/google/android/gms/internal/measurement/zzbq$zzb;->zzb()J PLcom/google/android/gms/internal/measurement/zzbq$zzb;->zzc()Z PLcom/google/android/gms/internal/measurement/zzbq$zzb;->zzd()Ljava/lang/String; PLcom/google/android/gms/internal/measurement/zzbq$zzb;->zze()Ljava/util/List; PLcom/google/android/gms/internal/measurement/zzbq$zzb;->zzf()I PLcom/google/android/gms/internal/measurement/zzbq$zzb;->zzi()Lcom/google/android/gms/internal/measurement/zzbq$zzb$zza; PLcom/google/android/gms/internal/measurement/zzbq$zzb;->zzk()Lcom/google/android/gms/internal/measurement/zzbq$zzb; PLcom/google/android/gms/internal/measurement/zzbq$zzc;->()V PLcom/google/android/gms/internal/measurement/zzbq$zzc;->()V PLcom/google/android/gms/internal/measurement/zzbq$zzc;->zza()Ljava/lang/String; PLcom/google/android/gms/internal/measurement/zzbq$zzc;->zza(ILjava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLcom/google/android/gms/internal/measurement/zzbq$zzc;->zzb()Ljava/lang/String; PLcom/google/android/gms/internal/measurement/zzbr;->()V PLcom/google/android/gms/internal/measurement/zzbs$zza;->()V PLcom/google/android/gms/internal/measurement/zzbs$zza;->()V PLcom/google/android/gms/internal/measurement/zzbs$zza;->zza(ILjava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLcom/google/android/gms/internal/measurement/zzbs$zzc$zza;->(Lcom/google/android/gms/internal/measurement/zzbr;)V PLcom/google/android/gms/internal/measurement/zzbs$zzc$zza;->zza(Lcom/google/android/gms/internal/measurement/zzbs$zze$zza;)Lcom/google/android/gms/internal/measurement/zzbs$zzc$zza; PLcom/google/android/gms/internal/measurement/zzbs$zzc;->()V PLcom/google/android/gms/internal/measurement/zzbs$zzc;->()V PLcom/google/android/gms/internal/measurement/zzbs$zzc;->zza(ILjava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLcom/google/android/gms/internal/measurement/zzbs$zzc;->zza(Lcom/google/android/gms/internal/measurement/zzbs$zzc;Lcom/google/android/gms/internal/measurement/zzbs$zze;)V PLcom/google/android/gms/internal/measurement/zzbs$zzc;->zzb(Lcom/google/android/gms/internal/measurement/zzbs$zzc;J)V PLcom/google/android/gms/internal/measurement/zzbs$zzc;->zzj()Lcom/google/android/gms/internal/measurement/zzbs$zzc$zza; PLcom/google/android/gms/internal/measurement/zzbs$zzc;->zzk()Lcom/google/android/gms/internal/measurement/zzbs$zzc; PLcom/google/android/gms/internal/measurement/zzbs$zzc;->zzl()V PLcom/google/android/gms/internal/measurement/zzbs$zze$zza;->(Lcom/google/android/gms/internal/measurement/zzbr;)V PLcom/google/android/gms/internal/measurement/zzbs$zze$zza;->zza(J)Lcom/google/android/gms/internal/measurement/zzbs$zze$zza; PLcom/google/android/gms/internal/measurement/zzbs$zze$zza;->zza(Ljava/lang/String;)Lcom/google/android/gms/internal/measurement/zzbs$zze$zza; PLcom/google/android/gms/internal/measurement/zzbs$zze$zza;->zzb(Ljava/lang/String;)Lcom/google/android/gms/internal/measurement/zzbs$zze$zza; PLcom/google/android/gms/internal/measurement/zzbs$zze;->()V PLcom/google/android/gms/internal/measurement/zzbs$zze;->()V PLcom/google/android/gms/internal/measurement/zzbs$zze;->zza(ILjava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLcom/google/android/gms/internal/measurement/zzbs$zze;->zza(Lcom/google/android/gms/internal/measurement/zzbs$zze;)V PLcom/google/android/gms/internal/measurement/zzbs$zze;->zza(Lcom/google/android/gms/internal/measurement/zzbs$zze;J)V PLcom/google/android/gms/internal/measurement/zzbs$zze;->zza(Lcom/google/android/gms/internal/measurement/zzbs$zze;Ljava/lang/String;)V PLcom/google/android/gms/internal/measurement/zzbs$zze;->zzb(Lcom/google/android/gms/internal/measurement/zzbs$zze;)V PLcom/google/android/gms/internal/measurement/zzbs$zze;->zzb(Lcom/google/android/gms/internal/measurement/zzbs$zze;Ljava/lang/String;)V PLcom/google/android/gms/internal/measurement/zzbs$zze;->zzc(Lcom/google/android/gms/internal/measurement/zzbs$zze;)V PLcom/google/android/gms/internal/measurement/zzbs$zze;->zzd(Lcom/google/android/gms/internal/measurement/zzbs$zze;)V PLcom/google/android/gms/internal/measurement/zzbs$zze;->zzk()Lcom/google/android/gms/internal/measurement/zzbs$zze$zza; PLcom/google/android/gms/internal/measurement/zzbs$zze;->zzl()Lcom/google/android/gms/internal/measurement/zzbs$zze; PLcom/google/android/gms/internal/measurement/zzbs$zzg$zza;->(Lcom/google/android/gms/internal/measurement/zzbr;)V PLcom/google/android/gms/internal/measurement/zzbs$zzg$zza;->zza()Lcom/google/android/gms/internal/measurement/zzbs$zzg$zza; PLcom/google/android/gms/internal/measurement/zzbs$zzg$zza;->zza(Lcom/google/android/gms/internal/measurement/zzbs$zzk$zza;)Lcom/google/android/gms/internal/measurement/zzbs$zzg$zza; PLcom/google/android/gms/internal/measurement/zzbs$zzg$zza;->zza(Ljava/lang/String;)Lcom/google/android/gms/internal/measurement/zzbs$zzg$zza; PLcom/google/android/gms/internal/measurement/zzbs$zzg$zza;->zzb(Ljava/lang/String;)Lcom/google/android/gms/internal/measurement/zzbs$zzg$zza; PLcom/google/android/gms/internal/measurement/zzbs$zzg$zza;->zzc(Ljava/lang/String;)Lcom/google/android/gms/internal/measurement/zzbs$zzg$zza; PLcom/google/android/gms/internal/measurement/zzbs$zzg$zza;->zzd(Ljava/lang/String;)Lcom/google/android/gms/internal/measurement/zzbs$zzg$zza; PLcom/google/android/gms/internal/measurement/zzbs$zzg$zza;->zze(Ljava/lang/String;)Lcom/google/android/gms/internal/measurement/zzbs$zzg$zza; PLcom/google/android/gms/internal/measurement/zzbs$zzg$zza;->zzf(I)Lcom/google/android/gms/internal/measurement/zzbs$zzg$zza; PLcom/google/android/gms/internal/measurement/zzbs$zzg$zza;->zzf(J)Lcom/google/android/gms/internal/measurement/zzbs$zzg$zza; PLcom/google/android/gms/internal/measurement/zzbs$zzg$zza;->zzf(Ljava/lang/String;)Lcom/google/android/gms/internal/measurement/zzbs$zzg$zza; PLcom/google/android/gms/internal/measurement/zzbs$zzg$zza;->zzg(Ljava/lang/String;)Lcom/google/android/gms/internal/measurement/zzbs$zzg$zza; PLcom/google/android/gms/internal/measurement/zzbs$zzg$zza;->zzh(I)Lcom/google/android/gms/internal/measurement/zzbs$zzg$zza; PLcom/google/android/gms/internal/measurement/zzbs$zzg$zza;->zzi(Ljava/lang/String;)Lcom/google/android/gms/internal/measurement/zzbs$zzg$zza; PLcom/google/android/gms/internal/measurement/zzbs$zzg$zza;->zzj()Ljava/lang/String; PLcom/google/android/gms/internal/measurement/zzbs$zzg$zza;->zzk(J)Lcom/google/android/gms/internal/measurement/zzbs$zzg$zza; PLcom/google/android/gms/internal/measurement/zzbs$zzg$zza;->zzk(Ljava/lang/String;)Lcom/google/android/gms/internal/measurement/zzbs$zzg$zza; PLcom/google/android/gms/internal/measurement/zzbs$zzg$zza;->zzl()Ljava/lang/String; PLcom/google/android/gms/internal/measurement/zzbs$zzg$zza;->zzl(Ljava/lang/String;)Lcom/google/android/gms/internal/measurement/zzbs$zzg$zza; PLcom/google/android/gms/internal/measurement/zzbs$zzg$zza;->zzm(Ljava/lang/String;)Lcom/google/android/gms/internal/measurement/zzbs$zzg$zza; PLcom/google/android/gms/internal/measurement/zzbs$zzg;->()V PLcom/google/android/gms/internal/measurement/zzbs$zzg;->zza(ILjava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLcom/google/android/gms/internal/measurement/zzbs$zzg;->zza(Lcom/google/android/gms/internal/measurement/zzbs$zzg;Ljava/lang/String;)V PLcom/google/android/gms/internal/measurement/zzbs$zzg;->zzaa(Lcom/google/android/gms/internal/measurement/zzbs$zzg;)V PLcom/google/android/gms/internal/measurement/zzbs$zzg;->zzam()Ljava/lang/String; PLcom/google/android/gms/internal/measurement/zzbs$zzg;->zzb(Lcom/google/android/gms/internal/measurement/zzbs$zzg;Ljava/lang/String;)V PLcom/google/android/gms/internal/measurement/zzbs$zzg;->zzbf()Lcom/google/android/gms/internal/measurement/zzbs$zzg$zza; PLcom/google/android/gms/internal/measurement/zzbs$zzg;->zzbg()Lcom/google/android/gms/internal/measurement/zzbs$zzg; PLcom/google/android/gms/internal/measurement/zzbs$zzg;->zzc(Lcom/google/android/gms/internal/measurement/zzbs$zzg;Ljava/lang/String;)V PLcom/google/android/gms/internal/measurement/zzbs$zzg;->zzd(Lcom/google/android/gms/internal/measurement/zzbs$zzg;I)V PLcom/google/android/gms/internal/measurement/zzbs$zzg;->zzd(Lcom/google/android/gms/internal/measurement/zzbs$zzg;Ljava/lang/String;)V PLcom/google/android/gms/internal/measurement/zzbs$zzg;->zze(Lcom/google/android/gms/internal/measurement/zzbs$zzg;Ljava/lang/String;)V PLcom/google/android/gms/internal/measurement/zzbs$zzg;->zzf(Lcom/google/android/gms/internal/measurement/zzbs$zzg;I)V PLcom/google/android/gms/internal/measurement/zzbs$zzg;->zzf(Lcom/google/android/gms/internal/measurement/zzbs$zzg;J)V PLcom/google/android/gms/internal/measurement/zzbs$zzg;->zzf(Lcom/google/android/gms/internal/measurement/zzbs$zzg;Ljava/lang/String;)V PLcom/google/android/gms/internal/measurement/zzbs$zzg;->zzg(Lcom/google/android/gms/internal/measurement/zzbs$zzg;Ljava/lang/String;)V PLcom/google/android/gms/internal/measurement/zzbs$zzg;->zzi(Lcom/google/android/gms/internal/measurement/zzbs$zzg;Ljava/lang/String;)V PLcom/google/android/gms/internal/measurement/zzbs$zzg;->zzk(Lcom/google/android/gms/internal/measurement/zzbs$zzg;J)V PLcom/google/android/gms/internal/measurement/zzbs$zzg;->zzk(Lcom/google/android/gms/internal/measurement/zzbs$zzg;Ljava/lang/String;)V PLcom/google/android/gms/internal/measurement/zzbs$zzg;->zzl(Lcom/google/android/gms/internal/measurement/zzbs$zzg;Ljava/lang/String;)V PLcom/google/android/gms/internal/measurement/zzbs$zzg;->zzm(Lcom/google/android/gms/internal/measurement/zzbs$zzg;Ljava/lang/String;)V PLcom/google/android/gms/internal/measurement/zzbs$zzg;->zzx()Ljava/lang/String; PLcom/google/android/gms/internal/measurement/zzbs$zzk$zza;->(Lcom/google/android/gms/internal/measurement/zzbr;)V PLcom/google/android/gms/internal/measurement/zzbs$zzk$zza;->zza(J)Lcom/google/android/gms/internal/measurement/zzbs$zzk$zza; PLcom/google/android/gms/internal/measurement/zzbs$zzk$zza;->zzb(J)Lcom/google/android/gms/internal/measurement/zzbs$zzk$zza; PLcom/google/android/gms/internal/measurement/zzbs$zzk;->()V PLcom/google/android/gms/internal/measurement/zzbs$zzk;->()V PLcom/google/android/gms/internal/measurement/zzbs$zzk;->zza(Lcom/google/android/gms/internal/measurement/zzbs$zzk;)V PLcom/google/android/gms/internal/measurement/zzbs$zzk;->zza(Lcom/google/android/gms/internal/measurement/zzbs$zzk;J)V PLcom/google/android/gms/internal/measurement/zzbs$zzk;->zza(Lcom/google/android/gms/internal/measurement/zzbs$zzk;Ljava/lang/String;)V PLcom/google/android/gms/internal/measurement/zzbs$zzk;->zzb(Lcom/google/android/gms/internal/measurement/zzbs$zzk;)V PLcom/google/android/gms/internal/measurement/zzbs$zzk;->zzb(Lcom/google/android/gms/internal/measurement/zzbs$zzk;J)V PLcom/google/android/gms/internal/measurement/zzbs$zzk;->zzb(Lcom/google/android/gms/internal/measurement/zzbs$zzk;Ljava/lang/String;)V PLcom/google/android/gms/internal/measurement/zzbs$zzk;->zzc(Lcom/google/android/gms/internal/measurement/zzbs$zzk;)V PLcom/google/android/gms/internal/measurement/zzbs$zzk;->zzj()Lcom/google/android/gms/internal/measurement/zzbs$zzk$zza; PLcom/google/android/gms/internal/measurement/zzbs$zzk;->zzk()Lcom/google/android/gms/internal/measurement/zzbs$zzk; PLcom/google/android/gms/internal/measurement/zzbz;->()V PLcom/google/android/gms/internal/measurement/zzbz;->(Landroid/content/ContentResolver;Landroid/net/Uri;)V PLcom/google/android/gms/internal/measurement/zzbz;->zza(Landroid/content/ContentResolver;Landroid/net/Uri;)Lcom/google/android/gms/internal/measurement/zzbz; PLcom/google/android/gms/internal/measurement/zzbz;->zzc()V PLcom/google/android/gms/internal/measurement/zzc;->(Ljava/lang/String;)V PLcom/google/android/gms/internal/measurement/zzck;->()V PLcom/google/android/gms/internal/measurement/zzck;->zza(Ljava/lang/String;)Landroid/net/Uri; PLcom/google/android/gms/internal/measurement/zzcl;->()V PLcom/google/android/gms/internal/measurement/zzcl;->zza(Landroid/content/Context;Landroid/net/Uri;)Z PLcom/google/android/gms/internal/measurement/zzcn;->()V PLcom/google/android/gms/internal/measurement/zzcn;->(Lcom/google/android/gms/internal/measurement/zzct;Ljava/lang/String;Ljava/lang/Object;Lcom/google/android/gms/internal/measurement/zzco;)V PLcom/google/android/gms/internal/measurement/zzcn;->zza(Ljava/lang/String;)Ljava/lang/String; PLcom/google/android/gms/internal/measurement/zzco;->(Lcom/google/android/gms/internal/measurement/zzct;Ljava/lang/String;Ljava/lang/Object;I)V PLcom/google/android/gms/internal/measurement/zzcs;->()V PLcom/google/android/gms/internal/measurement/zzcs;->zza()V PLcom/google/android/gms/internal/measurement/zzct;->(Landroid/net/Uri;)V PLcom/google/android/gms/internal/measurement/zzct;->zza(Ljava/lang/String;J)Lcom/google/android/gms/internal/measurement/zzcn; PLcom/google/android/gms/internal/measurement/zzct;->zza(Ljava/lang/String;Ljava/lang/String;)Lcom/google/android/gms/internal/measurement/zzcn; PLcom/google/android/gms/internal/measurement/zzct;->zza(Ljava/lang/String;Z)Lcom/google/android/gms/internal/measurement/zzcn; PLcom/google/android/gms/internal/measurement/zzcu;->()V PLcom/google/android/gms/internal/measurement/zzcu;->()V PLcom/google/android/gms/internal/measurement/zzcu;->zza()Z PLcom/google/android/gms/internal/measurement/zzcw;->()V PLcom/google/android/gms/internal/measurement/zzcw;->zza(Ljava/lang/Object;)Lcom/google/android/gms/internal/measurement/zzcw; PLcom/google/android/gms/internal/measurement/zzcy;->(Ljava/lang/Object;)V PLcom/google/android/gms/internal/measurement/zzcy;->zza()Z PLcom/google/android/gms/internal/measurement/zzcy;->zzb()Ljava/lang/Object; PLcom/google/android/gms/internal/measurement/zzdc;->(Lcom/google/android/gms/internal/measurement/zzdb;)V PLcom/google/android/gms/internal/measurement/zzdc;->zza()Ljava/lang/Object; PLcom/google/android/gms/internal/measurement/zzdd;->(Lcom/google/android/gms/internal/measurement/zzdb;)V PLcom/google/android/gms/internal/measurement/zzdf;->(Ljava/lang/Object;)V PLcom/google/android/gms/internal/measurement/zzdf;->zza()Ljava/lang/Object; PLcom/google/android/gms/internal/measurement/zzdl;->()V PLcom/google/android/gms/internal/measurement/zzdm;->zzbi()[B PLcom/google/android/gms/internal/measurement/zzdp;->()V PLcom/google/android/gms/internal/measurement/zzdq;->()V PLcom/google/android/gms/internal/measurement/zzdq;->zzc()V PLcom/google/android/gms/internal/measurement/zzel$zza;->()V PLcom/google/android/gms/internal/measurement/zzel$zza;->([BI)V PLcom/google/android/gms/internal/measurement/zzel$zza;->zza()I PLcom/google/android/gms/internal/measurement/zzel$zza;->zza(Lcom/google/android/gms/internal/measurement/zzgm;Lcom/google/android/gms/internal/measurement/zzhf;)I PLcom/google/android/gms/internal/measurement/zzel$zza;->zzb(II)V PLcom/google/android/gms/internal/measurement/zzel$zza;->zzb(ILjava/lang/String;)I PLcom/google/android/gms/internal/measurement/zzel$zza;->zzb(Ljava/lang/String;)I PLcom/google/android/gms/internal/measurement/zzel$zza;->zzd(IJ)I PLcom/google/android/gms/internal/measurement/zzel$zza;->zze(I)I PLcom/google/android/gms/internal/measurement/zzel$zza;->zze(J)I PLcom/google/android/gms/internal/measurement/zzel$zza;->zzf(I)I PLcom/google/android/gms/internal/measurement/zzel$zza;->zzf(II)I PLcom/google/android/gms/internal/measurement/zzel$zza;->zzg(I)I PLcom/google/android/gms/internal/measurement/zzer;->()V PLcom/google/android/gms/internal/measurement/zzer;->()V PLcom/google/android/gms/internal/measurement/zzer;->zza()Lcom/google/android/gms/internal/measurement/zzer; PLcom/google/android/gms/internal/measurement/zzes;->()V PLcom/google/android/gms/internal/measurement/zzev;->()V PLcom/google/android/gms/internal/measurement/zzfc;->()V PLcom/google/android/gms/internal/measurement/zzfc;->()V PLcom/google/android/gms/internal/measurement/zzfc;->zza(Ljava/lang/Class;)Z PLcom/google/android/gms/internal/measurement/zzfc;->zzb(Ljava/lang/Class;)Lcom/google/android/gms/internal/measurement/zzgk; PLcom/google/android/gms/internal/measurement/zzfd;->()V PLcom/google/android/gms/internal/measurement/zzfd;->zza(Ljava/lang/Class;)Lcom/google/android/gms/internal/measurement/zzer; PLcom/google/android/gms/internal/measurement/zzfe$zza;->zza(Lcom/google/android/gms/internal/measurement/zzfe;)Lcom/google/android/gms/internal/measurement/zzfe$zza; PLcom/google/android/gms/internal/measurement/zzfe$zza;->zzb([BIILcom/google/android/gms/internal/measurement/zzer;)Lcom/google/android/gms/internal/measurement/zzfe$zza; PLcom/google/android/gms/internal/measurement/zzfe;->()V PLcom/google/android/gms/internal/measurement/zzfe;->g_()Z PLcom/google/android/gms/internal/measurement/zzfe;->zza(Lcom/google/android/gms/internal/measurement/zzel$zza;)V PLcom/google/android/gms/internal/measurement/zzfe;->zza(Lcom/google/android/gms/internal/measurement/zzfn;)Lcom/google/android/gms/internal/measurement/zzfn; PLcom/google/android/gms/internal/measurement/zzfe;->zza(Ljava/lang/Class;)Lcom/google/android/gms/internal/measurement/zzfe; PLcom/google/android/gms/internal/measurement/zzfe;->zza(Ljava/lang/Class;Lcom/google/android/gms/internal/measurement/zzfe;)V PLcom/google/android/gms/internal/measurement/zzfe;->zzbj()I PLcom/google/android/gms/internal/measurement/zzfe;->zzbk()Lcom/google/android/gms/internal/measurement/zzfe$zza; PLcom/google/android/gms/internal/measurement/zzfe;->zzbl()Lcom/google/android/gms/internal/measurement/zzfe$zza; PLcom/google/android/gms/internal/measurement/zzfe;->zzbm()I PLcom/google/android/gms/internal/measurement/zzfe;->zzc(I)V PLcom/google/android/gms/internal/measurement/zzff;->()V PLcom/google/android/gms/internal/measurement/zzff;->([II)V PLcom/google/android/gms/internal/measurement/zzff;->size()I PLcom/google/android/gms/internal/measurement/zzfh;->()V PLcom/google/android/gms/internal/measurement/zzfw;->()V PLcom/google/android/gms/internal/measurement/zzfw;->(Lcom/google/android/gms/internal/measurement/zzgr;)V PLcom/google/android/gms/internal/measurement/zzfy;->()V PLcom/google/android/gms/internal/measurement/zzfy;->(Lcom/google/android/gms/internal/measurement/zzgr;)V PLcom/google/android/gms/internal/measurement/zzgb;->(Lcom/google/android/gms/internal/measurement/zzgr;)V PLcom/google/android/gms/internal/measurement/zzgb;->zza(Ljava/lang/Object;Ljava/lang/Object;J)V PLcom/google/android/gms/internal/measurement/zzgb;->zzb(Ljava/lang/Object;J)V PLcom/google/android/gms/internal/measurement/zzgb;->zzc(Ljava/lang/Object;J)Lcom/google/android/gms/internal/measurement/zzfn; PLcom/google/android/gms/internal/measurement/zzgc;->()V PLcom/google/android/gms/internal/measurement/zzgd;->()V PLcom/google/android/gms/internal/measurement/zzgd;->()V PLcom/google/android/gms/internal/measurement/zzgd;->zza(Lcom/google/android/gms/internal/measurement/zzgk;)Z PLcom/google/android/gms/internal/measurement/zzgf;->([Lcom/google/android/gms/internal/measurement/zzgn;)V PLcom/google/android/gms/internal/measurement/zzgf;->zzb(Ljava/lang/Class;)Lcom/google/android/gms/internal/measurement/zzgk; PLcom/google/android/gms/internal/measurement/zzgi;->()V PLcom/google/android/gms/internal/measurement/zzgl;->()V PLcom/google/android/gms/internal/measurement/zzgq;->()V PLcom/google/android/gms/internal/measurement/zzgq;->([I[Ljava/lang/Object;IILcom/google/android/gms/internal/measurement/zzgm;Z[IIILcom/google/android/gms/internal/measurement/zzgx;Lcom/google/android/gms/internal/measurement/zzfw;Lcom/google/android/gms/internal/measurement/zzhz;Lcom/google/android/gms/internal/measurement/zzes;Lcom/google/android/gms/internal/measurement/zzgi;)V PLcom/google/android/gms/internal/measurement/zzgq;->zza$4(Ljava/lang/Object;[BIILcom/google/android/gms/internal/clearcut/zzay;)V PLcom/google/android/gms/internal/measurement/zzgq;->zza()Ljava/lang/Object; PLcom/google/android/gms/internal/measurement/zzgq;->zza(I)Lcom/google/android/gms/internal/measurement/zzhf; PLcom/google/android/gms/internal/measurement/zzgq;->zza(Lcom/google/android/gms/internal/measurement/zzgk;Lcom/google/android/gms/internal/measurement/zzgx;Lcom/google/android/gms/internal/measurement/zzfw;Lcom/google/android/gms/internal/measurement/zzhz;Lcom/google/android/gms/internal/measurement/zzes;Lcom/google/android/gms/internal/measurement/zzgi;)Lcom/google/android/gms/internal/measurement/zzgq; PLcom/google/android/gms/internal/measurement/zzgq;->zza(Lcom/google/android/gms/internal/measurement/zzhz;Ljava/lang/Object;Landroidx/compose/runtime/Stack;)V PLcom/google/android/gms/internal/measurement/zzgq;->zza(Ljava/lang/Class;Ljava/lang/String;)Ljava/lang/reflect/Field; PLcom/google/android/gms/internal/measurement/zzgq;->zza(Ljava/lang/Object;I)Z PLcom/google/android/gms/internal/measurement/zzgq;->zza(Ljava/lang/Object;Landroidx/compose/runtime/Stack;)V PLcom/google/android/gms/internal/measurement/zzgq;->zza(Ljava/lang/Object;[BIIILcom/google/android/gms/internal/clearcut/zzay;)I PLcom/google/android/gms/internal/measurement/zzgq;->zzb(II)I PLcom/google/android/gms/internal/measurement/zzgq;->zzb(Ljava/lang/Object;I)V PLcom/google/android/gms/internal/measurement/zzgq;->zzb(Ljava/lang/Object;Ljava/lang/Object;)V PLcom/google/android/gms/internal/measurement/zzgq;->zzd(I)I PLcom/google/android/gms/internal/measurement/zzgr;->()V PLcom/google/android/gms/internal/measurement/zzgr;->()V PLcom/google/android/gms/internal/measurement/zzgr;->zza()[I PLcom/google/android/gms/internal/measurement/zzgr;->zza(Lcom/google/android/gms/internal/measurement/zzdb;)Lcom/google/android/gms/internal/measurement/zzdb; PLcom/google/android/gms/internal/measurement/zzgr;->zza(Lcom/google/android/gms/internal/measurement/zzhf;I[BIILcom/google/android/gms/internal/measurement/zzfn;Lcom/google/android/gms/internal/clearcut/zzay;)I PLcom/google/android/gms/internal/measurement/zzgr;->zza(Lcom/google/android/gms/internal/measurement/zzhf;[BIILcom/google/android/gms/internal/clearcut/zzay;)I PLcom/google/android/gms/internal/measurement/zzgr;->zza([BILcom/google/android/gms/internal/clearcut/zzay;)I PLcom/google/android/gms/internal/measurement/zzgr;->zzb([BILcom/google/android/gms/internal/clearcut/zzay;)I PLcom/google/android/gms/internal/measurement/zzgr;->zzc([BILcom/google/android/gms/internal/clearcut/zzay;)I PLcom/google/android/gms/internal/measurement/zzgw;->()V PLcom/google/android/gms/internal/measurement/zzgx;->()V PLcom/google/android/gms/internal/measurement/zzh;->()V PLcom/google/android/gms/internal/measurement/zzha;->()V PLcom/google/android/gms/internal/measurement/zzha;->([Ljava/lang/Object;I)V PLcom/google/android/gms/internal/measurement/zzha;->get(I)Ljava/lang/Object; PLcom/google/android/gms/internal/measurement/zzha;->size()I PLcom/google/android/gms/internal/measurement/zzha;->zza(I)Lcom/google/android/gms/internal/measurement/zzfn; PLcom/google/android/gms/internal/measurement/zzha;->zzb(I)V PLcom/google/android/gms/internal/measurement/zzhb;->()V PLcom/google/android/gms/internal/measurement/zzhb;->()V PLcom/google/android/gms/internal/measurement/zzhb;->zza(Ljava/lang/Object;)Lcom/google/android/gms/internal/measurement/zzhf; PLcom/google/android/gms/internal/measurement/zzhd;->(Lcom/google/android/gms/internal/measurement/zzgm;Ljava/lang/String;[Ljava/lang/Object;)V PLcom/google/android/gms/internal/measurement/zzhh;->()V PLcom/google/android/gms/internal/measurement/zzhh;->zza(ILjava/util/List;Landroidx/compose/runtime/Stack;Lcom/google/android/gms/internal/measurement/zzhf;)V PLcom/google/android/gms/internal/measurement/zzhh;->zza(ILjava/util/List;Lcom/google/android/gms/internal/measurement/zzhf;)I PLcom/google/android/gms/internal/measurement/zzhh;->zza(Lcom/google/android/gms/internal/measurement/zzhz;Ljava/lang/Object;Ljava/lang/Object;)V PLcom/google/android/gms/internal/measurement/zzhh;->zza(Z)Lcom/google/android/gms/internal/measurement/zzhz; PLcom/google/android/gms/internal/measurement/zzhh;->zzf(ILjava/util/List;)I PLcom/google/android/gms/internal/measurement/zzhh;->zzi(ILjava/util/List;Landroidx/compose/runtime/Stack;Z)V PLcom/google/android/gms/internal/measurement/zzhw;->()V PLcom/google/android/gms/internal/measurement/zzhw;->(I[I[Ljava/lang/Object;Z)V PLcom/google/android/gms/internal/measurement/zzhw;->equals(Ljava/lang/Object;)Z PLcom/google/android/gms/internal/measurement/zzhw;->zzb(Landroidx/compose/runtime/Stack;)V PLcom/google/android/gms/internal/measurement/zzhw;->zze()I PLcom/google/android/gms/internal/measurement/zzhz;->()V PLcom/google/android/gms/internal/measurement/zzic;->()V PLcom/google/android/gms/internal/measurement/zzic;->run()Ljava/lang/Object; PLcom/google/android/gms/internal/measurement/zzid$zza;->(Lsun/misc/Unsafe;I)V PLcom/google/android/gms/internal/measurement/zzid$zza;->zza(Ljava/lang/Object;JB)V PLcom/google/android/gms/internal/measurement/zzid$zza;->zza(Ljava/lang/Object;JZ)V PLcom/google/android/gms/internal/measurement/zzid$zza;->zzb(Ljava/lang/Object;J)Z PLcom/google/android/gms/internal/measurement/zzid;->()V PLcom/google/android/gms/internal/measurement/zzid;->zza(Ljava/lang/Object;J)I PLcom/google/android/gms/internal/measurement/zzid;->zza(Ljava/lang/Object;JJ)V PLcom/google/android/gms/internal/measurement/zzid;->zza(Ljava/lang/Object;JLjava/lang/Object;)V PLcom/google/android/gms/internal/measurement/zzid;->zza([BJB)V PLcom/google/android/gms/internal/measurement/zzid;->zzb(Ljava/lang/Class;)I PLcom/google/android/gms/internal/measurement/zzid;->zzb(Ljava/lang/Object;J)J PLcom/google/android/gms/internal/measurement/zzid;->zzc()Lsun/misc/Unsafe; PLcom/google/android/gms/internal/measurement/zzid;->zzc(Ljava/lang/Class;)I PLcom/google/android/gms/internal/measurement/zzid;->zzc(Ljava/lang/Object;J)Z PLcom/google/android/gms/internal/measurement/zzid;->zzd(Ljava/lang/Class;)Z PLcom/google/android/gms/internal/measurement/zzid;->zzd(Ljava/lang/Object;JB)V PLcom/google/android/gms/internal/measurement/zzid;->zzf()Ljava/lang/reflect/Field; PLcom/google/android/gms/internal/measurement/zzid;->zzf(Ljava/lang/Object;J)Ljava/lang/Object; PLcom/google/android/gms/internal/measurement/zzid;->zzl(Ljava/lang/Object;J)B PLcom/google/android/gms/internal/measurement/zzif;->()V PLcom/google/android/gms/internal/measurement/zzig;->(I)V PLcom/google/android/gms/internal/measurement/zzit;->()V PLcom/google/android/gms/internal/measurement/zzit;->()V PLcom/google/android/gms/internal/measurement/zziu;->()V PLcom/google/android/gms/internal/measurement/zziu;->()V PLcom/google/android/gms/internal/measurement/zziv;->()V PLcom/google/android/gms/internal/measurement/zziv;->()V PLcom/google/android/gms/internal/measurement/zziw;->()V PLcom/google/android/gms/internal/measurement/zziw;->()V PLcom/google/android/gms/internal/measurement/zziz;->()V PLcom/google/android/gms/internal/measurement/zziz;->()V PLcom/google/android/gms/internal/measurement/zzj;->(Landroid/os/Looper;)V PLcom/google/android/gms/internal/measurement/zzj;->dispatchMessage(Landroid/os/Message;)V PLcom/google/android/gms/internal/measurement/zzja;->()V PLcom/google/android/gms/internal/measurement/zzja;->()V PLcom/google/android/gms/internal/measurement/zzjb;->()V PLcom/google/android/gms/internal/measurement/zzjb;->()V PLcom/google/android/gms/internal/measurement/zzjc;->()V PLcom/google/android/gms/internal/measurement/zzjc;->()V PLcom/google/android/gms/internal/measurement/zzjf;->()V PLcom/google/android/gms/internal/measurement/zzjf;->()V PLcom/google/android/gms/internal/measurement/zzjg;->()V PLcom/google/android/gms/internal/measurement/zzjg;->()V PLcom/google/android/gms/internal/measurement/zzjg;->zzb()Z PLcom/google/android/gms/internal/measurement/zzjh;->()V PLcom/google/android/gms/internal/measurement/zzjh;->()V PLcom/google/android/gms/internal/measurement/zzji;->()V PLcom/google/android/gms/internal/measurement/zzji;->()V PLcom/google/android/gms/internal/measurement/zzjl;->()V PLcom/google/android/gms/internal/measurement/zzjl;->()V PLcom/google/android/gms/internal/measurement/zzjm;->()V PLcom/google/android/gms/internal/measurement/zzjm;->()V PLcom/google/android/gms/internal/measurement/zzjn;->()V PLcom/google/android/gms/internal/measurement/zzjn;->()V PLcom/google/android/gms/internal/measurement/zzjo;->()V PLcom/google/android/gms/internal/measurement/zzjo;->()V PLcom/google/android/gms/internal/measurement/zzjr;->()V PLcom/google/android/gms/internal/measurement/zzjr;->()V PLcom/google/android/gms/internal/measurement/zzjs;->()V PLcom/google/android/gms/internal/measurement/zzjs;->()V PLcom/google/android/gms/internal/measurement/zzjt;->()V PLcom/google/android/gms/internal/measurement/zzjt;->()V PLcom/google/android/gms/internal/measurement/zzju;->()V PLcom/google/android/gms/internal/measurement/zzju;->()V PLcom/google/android/gms/internal/measurement/zzjx;->()V PLcom/google/android/gms/internal/measurement/zzjx;->()V PLcom/google/android/gms/internal/measurement/zzjx;->zzb()Z PLcom/google/android/gms/internal/measurement/zzjy;->()V PLcom/google/android/gms/internal/measurement/zzjy;->()V PLcom/google/android/gms/internal/measurement/zzjz;->()V PLcom/google/android/gms/internal/measurement/zzjz;->()V PLcom/google/android/gms/internal/measurement/zzka;->()V PLcom/google/android/gms/internal/measurement/zzka;->()V PLcom/google/android/gms/internal/measurement/zzkd;->()V PLcom/google/android/gms/internal/measurement/zzkd;->()V PLcom/google/android/gms/internal/measurement/zzke;->()V PLcom/google/android/gms/internal/measurement/zzke;->()V PLcom/google/android/gms/internal/measurement/zzkf;->()V PLcom/google/android/gms/internal/measurement/zzkf;->()V PLcom/google/android/gms/internal/measurement/zzkg;->()V PLcom/google/android/gms/internal/measurement/zzkg;->()V PLcom/google/android/gms/internal/measurement/zzkj;->()V PLcom/google/android/gms/internal/measurement/zzkj;->()V PLcom/google/android/gms/internal/measurement/zzkj;->zzb()Z PLcom/google/android/gms/internal/measurement/zzkk;->()V PLcom/google/android/gms/internal/measurement/zzkk;->()V PLcom/google/android/gms/internal/measurement/zzkl;->()V PLcom/google/android/gms/internal/measurement/zzkl;->()V PLcom/google/android/gms/internal/measurement/zzkm;->()V PLcom/google/android/gms/internal/measurement/zzkm;->()V PLcom/google/android/gms/internal/measurement/zzkp;->()V PLcom/google/android/gms/internal/measurement/zzkp;->()V PLcom/google/android/gms/internal/measurement/zzkp;->zzb()Z PLcom/google/android/gms/internal/measurement/zzkq;->()V PLcom/google/android/gms/internal/measurement/zzkq;->()V PLcom/google/android/gms/internal/measurement/zzkr;->()V PLcom/google/android/gms/internal/measurement/zzkr;->()V PLcom/google/android/gms/internal/measurement/zzks;->()V PLcom/google/android/gms/internal/measurement/zzks;->()V PLcom/google/android/gms/internal/measurement/zzkv;->()V PLcom/google/android/gms/internal/measurement/zzkv;->()V PLcom/google/android/gms/internal/measurement/zzkw;->()V PLcom/google/android/gms/internal/measurement/zzkw;->()V PLcom/google/android/gms/internal/measurement/zzkx;->()V PLcom/google/android/gms/internal/measurement/zzkx;->()V PLcom/google/android/gms/internal/measurement/zzky;->()V PLcom/google/android/gms/internal/measurement/zzky;->()V PLcom/google/android/gms/internal/measurement/zzl;->()V PLcom/google/android/gms/internal/measurement/zzl;->zza(Landroid/os/Bundle;)V PLcom/google/android/gms/internal/measurement/zzl;->zzb(J)Landroid/os/Bundle; PLcom/google/android/gms/internal/measurement/zzlb;->()V PLcom/google/android/gms/internal/measurement/zzlb;->()V PLcom/google/android/gms/internal/measurement/zzlc;->()V PLcom/google/android/gms/internal/measurement/zzlc;->()V PLcom/google/android/gms/internal/measurement/zzld;->()V PLcom/google/android/gms/internal/measurement/zzld;->()V PLcom/google/android/gms/internal/measurement/zzle;->()V PLcom/google/android/gms/internal/measurement/zzle;->()V PLcom/google/android/gms/internal/measurement/zzlh;->()V PLcom/google/android/gms/internal/measurement/zzlh;->()V PLcom/google/android/gms/internal/measurement/zzli;->()V PLcom/google/android/gms/internal/measurement/zzli;->()V PLcom/google/android/gms/internal/measurement/zzlj;->()V PLcom/google/android/gms/internal/measurement/zzlj;->()V PLcom/google/android/gms/internal/measurement/zzlk;->()V PLcom/google/android/gms/internal/measurement/zzlk;->()V PLcom/google/android/gms/internal/measurement/zzln;->()V PLcom/google/android/gms/internal/measurement/zzln;->()V PLcom/google/android/gms/internal/measurement/zzlo;->()V PLcom/google/android/gms/internal/measurement/zzlo;->()V PLcom/google/android/gms/internal/measurement/zzlp;->()V PLcom/google/android/gms/internal/measurement/zzlp;->()V PLcom/google/android/gms/internal/measurement/zzlq;->()V PLcom/google/android/gms/internal/measurement/zzlq;->()V PLcom/google/android/gms/internal/measurement/zzlt;->()V PLcom/google/android/gms/internal/measurement/zzlt;->()V PLcom/google/android/gms/internal/measurement/zzlu;->()V PLcom/google/android/gms/internal/measurement/zzlu;->()V PLcom/google/android/gms/internal/measurement/zzlv;->()V PLcom/google/android/gms/internal/measurement/zzlv;->()V PLcom/google/android/gms/internal/measurement/zzlw;->()V PLcom/google/android/gms/internal/measurement/zzlw;->()V PLcom/google/android/gms/internal/measurement/zzlz;->()V PLcom/google/android/gms/internal/measurement/zzlz;->()V PLcom/google/android/gms/internal/measurement/zzma;->()V PLcom/google/android/gms/internal/measurement/zzma;->()V PLcom/google/android/gms/internal/measurement/zzmb;->()V PLcom/google/android/gms/internal/measurement/zzmb;->()V PLcom/google/android/gms/internal/measurement/zzmc;->()V PLcom/google/android/gms/internal/measurement/zzmc;->()V PLcom/google/android/gms/internal/measurement/zzmf;->()V PLcom/google/android/gms/internal/measurement/zzmf;->()V PLcom/google/android/gms/internal/measurement/zzmg;->()V PLcom/google/android/gms/internal/measurement/zzmg;->()V PLcom/google/android/gms/internal/measurement/zzmh;->()V PLcom/google/android/gms/internal/measurement/zzmh;->()V PLcom/google/android/gms/internal/measurement/zzmi;->()V PLcom/google/android/gms/internal/measurement/zzmi;->()V PLcom/google/android/gms/internal/measurement/zzml;->()V PLcom/google/android/gms/internal/measurement/zzml;->()V PLcom/google/android/gms/internal/measurement/zzmm;->()V PLcom/google/android/gms/internal/measurement/zzmm;->()V PLcom/google/android/gms/internal/measurement/zzmn;->()V PLcom/google/android/gms/internal/measurement/zzmn;->()V PLcom/google/android/gms/internal/measurement/zzmo;->()V PLcom/google/android/gms/internal/measurement/zzmo;->()V PLcom/google/android/gms/internal/measurement/zzmr;->()V PLcom/google/android/gms/internal/measurement/zzmr;->()V PLcom/google/android/gms/internal/measurement/zzms;->()V PLcom/google/android/gms/internal/measurement/zzms;->()V PLcom/google/android/gms/internal/measurement/zzmt;->()V PLcom/google/android/gms/internal/measurement/zzmt;->()V PLcom/google/android/gms/internal/measurement/zzmu;->()V PLcom/google/android/gms/internal/measurement/zzmu;->()V PLcom/google/android/gms/internal/measurement/zzmx;->()V PLcom/google/android/gms/internal/measurement/zzmx;->()V PLcom/google/android/gms/internal/measurement/zzmy;->()V PLcom/google/android/gms/internal/measurement/zzmy;->()V PLcom/google/android/gms/internal/measurement/zzmz;->()V PLcom/google/android/gms/internal/measurement/zzmz;->()V PLcom/google/android/gms/internal/measurement/zzn;->()V PLcom/google/android/gms/internal/measurement/zzn;->asInterface(Landroid/os/IBinder;)Lcom/google/android/gms/internal/measurement/zzk; PLcom/google/android/gms/internal/measurement/zzna;->()V PLcom/google/android/gms/internal/measurement/zzna;->()V PLcom/google/android/gms/internal/measurement/zznd;->()V PLcom/google/android/gms/internal/measurement/zznd;->()V PLcom/google/android/gms/internal/measurement/zzne;->()V PLcom/google/android/gms/internal/measurement/zzne;->()V PLcom/google/android/gms/internal/measurement/zzw;->()V PLcom/google/android/gms/internal/measurement/zzx;->()V PLcom/google/android/gms/internal/measurement/zzx;->(JJZLjava/lang/String;Ljava/lang/String;Ljava/lang/String;Landroid/os/Bundle;)V PLcom/google/android/gms/internal/measurement/zzy;->(Lcom/google/android/gms/internal/measurement/zzz;Ljava/lang/String;Ljava/lang/String;Landroid/content/Context;Landroid/os/Bundle;)V PLcom/google/android/gms/internal/measurement/zzy;->zza()V PLcom/google/android/gms/internal/measurement/zzz$zzb;->(Lcom/google/android/gms/internal/measurement/zzz;Z)V PLcom/google/android/gms/internal/measurement/zzz$zzb;->run()V PLcom/google/android/gms/internal/measurement/zzz$zzd;->(Lcom/google/android/gms/measurement/internal/zzgz;)V PLcom/google/android/gms/internal/measurement/zzz$zzd;->zza()I PLcom/google/android/gms/internal/measurement/zzz$zzd;->zza(Ljava/lang/String;Ljava/lang/String;Landroid/os/Bundle;J)V PLcom/google/android/gms/internal/measurement/zzz;->(Landroid/content/Context;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Landroid/os/Bundle;)V PLcom/google/android/gms/internal/measurement/zzz;->zza(Landroid/content/Context;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Landroid/os/Bundle;)Lcom/google/android/gms/internal/measurement/zzz; PLcom/google/android/gms/internal/measurement/zzz;->zza(Ljava/lang/String;Ljava/lang/String;Landroid/os/Bundle;ZZLjava/lang/Long;)V PLcom/google/android/gms/internal/measurement/zzz;->zza(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Object;Z)V PLcom/google/android/gms/internal/measurement/zzz;->zzb(Landroid/content/Context;)Z PLcom/google/android/gms/internal/measurement/zzz;->zzi(Landroid/content/Context;)V PLcom/google/android/gms/internal/vision/zzfc;->()V PLcom/google/android/gms/internal/vision/zzit;->(Lcom/google/android/gms/measurement/internal/zzan;)V PLcom/google/android/gms/internal/vision/zzit;->hasNext()Z PLcom/google/android/gms/internal/vision/zzit;->next()Ljava/lang/Object; PLcom/google/android/gms/internal/vision/zziu$zzd;->(Lsun/misc/Unsafe;I)V PLcom/google/android/gms/internal/vision/zziu$zzd;->arrayBaseOffset(Ljava/lang/Class;)I PLcom/google/android/gms/internal/vision/zziu$zzd;->arrayIndexScale(Ljava/lang/Class;)I PLcom/google/android/gms/internal/vision/zziu$zzd;->getObject(Ljava/lang/Object;J)Ljava/lang/Object; PLcom/google/android/gms/internal/vision/zziu$zzd;->objectFieldOffset(Ljava/lang/reflect/Field;)J PLcom/google/android/gms/internal/vision/zziu$zzd;->putInt(Ljava/lang/Object;JI)V PLcom/google/android/gms/internal/vision/zziu$zzd;->putObject(Ljava/lang/Object;JLjava/lang/Object;)V PLcom/google/android/gms/internal/vision/zziu$zzd;->zza$com$google$android$gms$internal$measurement$zzid$zzc(Ljava/lang/Object;JI)V PLcom/google/android/gms/internal/vision/zziu$zzd;->zza$com$google$android$gms$internal$measurement$zzid$zzc(Ljava/lang/Object;JJ)V PLcom/google/android/gms/internal/vision/zziu$zzd;->zza(Ljava/lang/Object;JJ)V PLcom/google/android/gms/internal/vision/zziu$zzd;->zze(Ljava/lang/Object;J)I PLcom/google/android/gms/internal/vision/zziu$zzd;->zzf(Ljava/lang/Object;J)J PLcom/google/android/gms/measurement/AppMeasurement;->(Lcom/google/android/gms/measurement/internal/zzhy;)V PLcom/google/android/gms/measurement/AppMeasurement;->registerOnMeasurementEventListener(Lcom/google/android/gms/measurement/AppMeasurement$OnEventListener;)V PLcom/google/android/gms/measurement/AppMeasurement;->zza(Landroid/content/Context;Landroid/os/Bundle;)Lcom/google/android/gms/measurement/AppMeasurement; PLcom/google/android/gms/measurement/AppMeasurement;->zzb(Landroid/content/Context;Landroid/os/Bundle;)Lcom/google/android/gms/measurement/internal/zzhy; PLcom/google/android/gms/measurement/AppMeasurementService;->()V PLcom/google/android/gms/measurement/AppMeasurementService;->onBind(Landroid/content/Intent;)Landroid/os/IBinder; PLcom/google/android/gms/measurement/AppMeasurementService;->onCreate()V PLcom/google/android/gms/measurement/AppMeasurementService;->onDestroy()V PLcom/google/android/gms/measurement/AppMeasurementService;->onUnbind(Landroid/content/Intent;)Z PLcom/google/android/gms/measurement/AppMeasurementService;->zza()Landroidx/appcompat/view/ActionBarPolicy; PLcom/google/android/gms/measurement/internal/AppMeasurementDynamiteService$zza;->(Lcom/google/android/gms/measurement/internal/AppMeasurementDynamiteService;Lcom/google/android/gms/internal/measurement/zzq;)V PLcom/google/android/gms/measurement/internal/AppMeasurementDynamiteService$zza;->onEvent(Ljava/lang/String;Ljava/lang/String;Landroid/os/Bundle;J)V PLcom/google/android/gms/measurement/internal/AppMeasurementDynamiteService;->()V PLcom/google/android/gms/measurement/internal/AppMeasurementDynamiteService;->initialize(Lcom/google/android/gms/dynamic/IObjectWrapper;Lcom/google/android/gms/internal/measurement/zzx;J)V PLcom/google/android/gms/measurement/internal/AppMeasurementDynamiteService;->logEvent(Ljava/lang/String;Ljava/lang/String;Landroid/os/Bundle;ZZJ)V PLcom/google/android/gms/measurement/internal/AppMeasurementDynamiteService;->onActivityCreated(Lcom/google/android/gms/dynamic/IObjectWrapper;Landroid/os/Bundle;J)V PLcom/google/android/gms/measurement/internal/AppMeasurementDynamiteService;->onActivityDestroyed(Lcom/google/android/gms/dynamic/IObjectWrapper;J)V PLcom/google/android/gms/measurement/internal/AppMeasurementDynamiteService;->onActivityPaused(Lcom/google/android/gms/dynamic/IObjectWrapper;J)V PLcom/google/android/gms/measurement/internal/AppMeasurementDynamiteService;->onActivityResumed(Lcom/google/android/gms/dynamic/IObjectWrapper;J)V PLcom/google/android/gms/measurement/internal/AppMeasurementDynamiteService;->onActivitySaveInstanceState(Lcom/google/android/gms/dynamic/IObjectWrapper;Lcom/google/android/gms/internal/measurement/zzp;J)V PLcom/google/android/gms/measurement/internal/AppMeasurementDynamiteService;->onActivityStarted(Lcom/google/android/gms/dynamic/IObjectWrapper;J)V PLcom/google/android/gms/measurement/internal/AppMeasurementDynamiteService;->onActivityStopped(Lcom/google/android/gms/dynamic/IObjectWrapper;J)V PLcom/google/android/gms/measurement/internal/AppMeasurementDynamiteService;->registerOnMeasurementEventListener(Lcom/google/android/gms/internal/measurement/zzq;)V PLcom/google/android/gms/measurement/internal/AppMeasurementDynamiteService;->setCurrentScreen(Lcom/google/android/gms/dynamic/IObjectWrapper;Ljava/lang/String;Ljava/lang/String;J)V PLcom/google/android/gms/measurement/internal/AppMeasurementDynamiteService;->setMeasurementEnabled(ZJ)V PLcom/google/android/gms/measurement/internal/AppMeasurementDynamiteService;->setUserProperty(Ljava/lang/String;Ljava/lang/String;Lcom/google/android/gms/dynamic/IObjectWrapper;ZJ)V PLcom/google/android/gms/measurement/internal/AppMeasurementDynamiteService;->zza()V PLcom/google/android/gms/measurement/internal/zza;->(Lcom/google/android/gms/measurement/internal/zzfw;)V PLcom/google/android/gms/measurement/internal/zza;->zza(J)V PLcom/google/android/gms/measurement/internal/zza;->zzb(J)V PLcom/google/android/gms/measurement/internal/zzac;->()V PLcom/google/android/gms/measurement/internal/zzad;->()V PLcom/google/android/gms/measurement/internal/zzad;->(Lcom/google/android/gms/measurement/internal/zzka;)V PLcom/google/android/gms/measurement/internal/zzad;->b_()V PLcom/google/android/gms/measurement/internal/zzad;->zza(JLjava/lang/String;ZZ)Lcom/google/android/gms/measurement/internal/zzac; PLcom/google/android/gms/measurement/internal/zzad;->zza(Landroid/content/ContentValues;Ljava/lang/String;Ljava/lang/Object;)V PLcom/google/android/gms/measurement/internal/zzad;->zza(Landroid/database/Cursor;I)Ljava/lang/Object; PLcom/google/android/gms/measurement/internal/zzad;->zza(Lcom/google/android/gms/internal/measurement/zzbs$zzg;)J PLcom/google/android/gms/measurement/internal/zzad;->zza(Lcom/google/android/gms/measurement/internal/zzkj;)Z PLcom/google/android/gms/measurement/internal/zzad;->zza(Ljava/lang/String;[Ljava/lang/String;J)J PLcom/google/android/gms/measurement/internal/zzad;->zzam()Z PLcom/google/android/gms/measurement/internal/zzad;->zzb(Ljava/lang/String;[Ljava/lang/String;)J PLcom/google/android/gms/measurement/internal/zzad;->zzc(Ljava/lang/String;)J PLcom/google/android/gms/measurement/internal/zzad;->zzc(Ljava/lang/String;Ljava/lang/String;)Lcom/google/android/gms/measurement/internal/zzkj; PLcom/google/android/gms/measurement/internal/zzad;->zze()Z PLcom/google/android/gms/measurement/internal/zzad;->zzf()V PLcom/google/android/gms/measurement/internal/zzad;->zzh()V PLcom/google/android/gms/measurement/internal/zzad;->zzv()V PLcom/google/android/gms/measurement/internal/zzae;->(Landroidx/transition/ViewOverlayApi14;Landroid/content/Context;Ljava/lang/String;I)V PLcom/google/android/gms/measurement/internal/zzag;->(Lcom/google/android/gms/measurement/internal/zzgt;)V PLcom/google/android/gms/measurement/internal/zzag;->zzc()V PLcom/google/android/gms/measurement/internal/zzag;->zzd()Landroid/os/Handler; PLcom/google/android/gms/measurement/internal/zzai;->(Lcom/google/android/gms/measurement/internal/zzfw;)V PLcom/google/android/gms/measurement/internal/zzai;->zza(Landroid/content/Context;)Z PLcom/google/android/gms/measurement/internal/zzai;->zze()Z PLcom/google/android/gms/measurement/internal/zzai;->zzf()J PLcom/google/android/gms/measurement/internal/zzai;->zzg()Ljava/lang/String; PLcom/google/android/gms/measurement/internal/zzak;->(Ljava/lang/String;Ljava/lang/String;JJJJJLjava/lang/Long;Ljava/lang/Long;Ljava/lang/Long;Ljava/lang/Boolean;)V PLcom/google/android/gms/measurement/internal/zzak;->zza(J)Lcom/google/android/gms/measurement/internal/zzak; PLcom/google/android/gms/measurement/internal/zzal;->(Lcom/google/android/gms/measurement/internal/zzfw;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;JJLcom/google/android/gms/measurement/internal/zzan;)V PLcom/google/android/gms/measurement/internal/zzal;->zza(Lcom/google/android/gms/measurement/internal/zzfw;J)Lcom/google/android/gms/measurement/internal/zzal; PLcom/google/android/gms/measurement/internal/zzan;->()V PLcom/google/android/gms/measurement/internal/zzan;->(Landroid/os/Bundle;)V PLcom/google/android/gms/measurement/internal/zzan;->iterator()Ljava/util/Iterator; PLcom/google/android/gms/measurement/internal/zzan;->writeToParcel(Landroid/os/Parcel;I)V PLcom/google/android/gms/measurement/internal/zzan;->zza(Ljava/lang/String;)Ljava/lang/Object; PLcom/google/android/gms/measurement/internal/zzan;->zzb()Landroid/os/Bundle; PLcom/google/android/gms/measurement/internal/zzao;->()V PLcom/google/android/gms/measurement/internal/zzao;->(Ljava/lang/String;Lcom/google/android/gms/measurement/internal/zzan;Ljava/lang/String;J)V PLcom/google/android/gms/measurement/internal/zzao;->writeToParcel(Landroid/os/Parcel;I)V PLcom/google/android/gms/measurement/internal/zzaq;->zza(Ljava/lang/String;Ljava/lang/Object;Ljava/lang/Object;Lcom/google/android/gms/measurement/internal/zzej;)Lcom/google/android/gms/measurement/internal/zzel; PLcom/google/android/gms/measurement/internal/zzbb;->()V PLcom/google/android/gms/measurement/internal/zzbb;->()V PLcom/google/android/gms/measurement/internal/zzbb;->create(Lcom/google/firebase/components/ComponentContainer;)Ljava/lang/Object; PLcom/google/android/gms/measurement/internal/zzbd;->()V PLcom/google/android/gms/measurement/internal/zzbd;->()V PLcom/google/android/gms/measurement/internal/zzbd;->create(Lcom/google/firebase/components/ComponentContainer;)Ljava/lang/Object; PLcom/google/android/gms/measurement/internal/zzbe;->()V PLcom/google/android/gms/measurement/internal/zzbe;->()V PLcom/google/android/gms/measurement/internal/zzbe;->create(Lcom/google/firebase/components/ComponentContainer;)Ljava/lang/Object; PLcom/google/android/gms/measurement/internal/zzbf;->()V PLcom/google/android/gms/measurement/internal/zzbf;->()V PLcom/google/android/gms/measurement/internal/zzbg;->()V PLcom/google/android/gms/measurement/internal/zzbg;->()V PLcom/google/android/gms/measurement/internal/zzbh;->()V PLcom/google/android/gms/measurement/internal/zzbh;->()V PLcom/google/android/gms/measurement/internal/zzbi;->()V PLcom/google/android/gms/measurement/internal/zzbi;->()V PLcom/google/android/gms/measurement/internal/zzbj;->()V PLcom/google/android/gms/measurement/internal/zzbj;->()V PLcom/google/android/gms/measurement/internal/zzbk;->()V PLcom/google/android/gms/measurement/internal/zzbk;->()V PLcom/google/android/gms/measurement/internal/zzbl;->()V PLcom/google/android/gms/measurement/internal/zzbl;->()V PLcom/google/android/gms/measurement/internal/zzbm;->()V PLcom/google/android/gms/measurement/internal/zzbm;->()V PLcom/google/android/gms/measurement/internal/zzbn;->()V PLcom/google/android/gms/measurement/internal/zzbn;->()V PLcom/google/android/gms/measurement/internal/zzbo;->()V PLcom/google/android/gms/measurement/internal/zzbo;->()V PLcom/google/android/gms/measurement/internal/zzbp;->()V PLcom/google/android/gms/measurement/internal/zzbp;->()V PLcom/google/android/gms/measurement/internal/zzbq;->()V PLcom/google/android/gms/measurement/internal/zzbq;->()V PLcom/google/android/gms/measurement/internal/zzbr;->()V PLcom/google/android/gms/measurement/internal/zzbr;->()V PLcom/google/android/gms/measurement/internal/zzbs;->()V PLcom/google/android/gms/measurement/internal/zzbs;->()V PLcom/google/android/gms/measurement/internal/zzbt;->()V PLcom/google/android/gms/measurement/internal/zzbt;->()V PLcom/google/android/gms/measurement/internal/zzbu;->()V PLcom/google/android/gms/measurement/internal/zzbu;->()V PLcom/google/android/gms/measurement/internal/zzbv;->()V PLcom/google/android/gms/measurement/internal/zzbv;->()V PLcom/google/android/gms/measurement/internal/zzbw;->()V PLcom/google/android/gms/measurement/internal/zzbw;->()V PLcom/google/android/gms/measurement/internal/zzbx;->()V PLcom/google/android/gms/measurement/internal/zzbx;->()V PLcom/google/android/gms/measurement/internal/zzby;->()V PLcom/google/android/gms/measurement/internal/zzby;->()V PLcom/google/android/gms/measurement/internal/zzbz;->()V PLcom/google/android/gms/measurement/internal/zzbz;->()V PLcom/google/android/gms/measurement/internal/zzca;->()V PLcom/google/android/gms/measurement/internal/zzca;->()V PLcom/google/android/gms/measurement/internal/zzcb;->()V PLcom/google/android/gms/measurement/internal/zzcb;->()V PLcom/google/android/gms/measurement/internal/zzcc;->()V PLcom/google/android/gms/measurement/internal/zzcc;->()V PLcom/google/android/gms/measurement/internal/zzcd;->()V PLcom/google/android/gms/measurement/internal/zzcd;->()V PLcom/google/android/gms/measurement/internal/zzce;->()V PLcom/google/android/gms/measurement/internal/zzce;->()V PLcom/google/android/gms/measurement/internal/zzcf;->()V PLcom/google/android/gms/measurement/internal/zzcf;->()V PLcom/google/android/gms/measurement/internal/zzcg;->()V PLcom/google/android/gms/measurement/internal/zzcg;->()V PLcom/google/android/gms/measurement/internal/zzch;->()V PLcom/google/android/gms/measurement/internal/zzch;->()V PLcom/google/android/gms/measurement/internal/zzci;->()V PLcom/google/android/gms/measurement/internal/zzci;->()V PLcom/google/android/gms/measurement/internal/zzcj;->()V PLcom/google/android/gms/measurement/internal/zzcj;->()V PLcom/google/android/gms/measurement/internal/zzck;->()V PLcom/google/android/gms/measurement/internal/zzck;->()V PLcom/google/android/gms/measurement/internal/zzcl;->()V PLcom/google/android/gms/measurement/internal/zzcl;->()V PLcom/google/android/gms/measurement/internal/zzcm;->()V PLcom/google/android/gms/measurement/internal/zzcm;->()V PLcom/google/android/gms/measurement/internal/zzcn;->()V PLcom/google/android/gms/measurement/internal/zzcn;->()V PLcom/google/android/gms/measurement/internal/zzco;->()V PLcom/google/android/gms/measurement/internal/zzco;->()V PLcom/google/android/gms/measurement/internal/zzcp;->()V PLcom/google/android/gms/measurement/internal/zzcp;->()V PLcom/google/android/gms/measurement/internal/zzcq;->()V PLcom/google/android/gms/measurement/internal/zzcq;->()V PLcom/google/android/gms/measurement/internal/zzcr;->()V PLcom/google/android/gms/measurement/internal/zzcr;->()V PLcom/google/android/gms/measurement/internal/zzcs;->()V PLcom/google/android/gms/measurement/internal/zzcs;->()V PLcom/google/android/gms/measurement/internal/zzct;->()V PLcom/google/android/gms/measurement/internal/zzct;->()V PLcom/google/android/gms/measurement/internal/zzcu;->()V PLcom/google/android/gms/measurement/internal/zzcu;->()V PLcom/google/android/gms/measurement/internal/zzcv;->()V PLcom/google/android/gms/measurement/internal/zzcv;->()V PLcom/google/android/gms/measurement/internal/zzcw;->()V PLcom/google/android/gms/measurement/internal/zzcw;->()V PLcom/google/android/gms/measurement/internal/zzcx;->()V PLcom/google/android/gms/measurement/internal/zzcx;->()V PLcom/google/android/gms/measurement/internal/zzcy;->()V PLcom/google/android/gms/measurement/internal/zzcy;->()V PLcom/google/android/gms/measurement/internal/zzcz;->()V PLcom/google/android/gms/measurement/internal/zzcz;->()V PLcom/google/android/gms/measurement/internal/zzd;->(Lcom/google/android/gms/measurement/internal/zzfw;)V PLcom/google/android/gms/measurement/internal/zzd;->zzb()V PLcom/google/android/gms/measurement/internal/zzd;->zze()Lcom/google/android/gms/measurement/internal/zza; PLcom/google/android/gms/measurement/internal/zzd;->zzf()Lcom/google/android/gms/measurement/internal/zzhb; PLcom/google/android/gms/measurement/internal/zzd;->zzg()Lcom/google/android/gms/measurement/internal/zzep; PLcom/google/android/gms/measurement/internal/zzd;->zzh()Lcom/google/android/gms/measurement/internal/zzil; PLcom/google/android/gms/measurement/internal/zzd;->zzi()Lcom/google/android/gms/measurement/internal/zzig; PLcom/google/android/gms/measurement/internal/zzd;->zzj()Lcom/google/android/gms/measurement/internal/zzeo; PLcom/google/android/gms/measurement/internal/zzd;->zzk()Lcom/google/android/gms/measurement/internal/zzjm; PLcom/google/android/gms/measurement/internal/zzda;->()V PLcom/google/android/gms/measurement/internal/zzda;->()V PLcom/google/android/gms/measurement/internal/zzdb;->()V PLcom/google/android/gms/measurement/internal/zzdb;->()V PLcom/google/android/gms/measurement/internal/zzdc;->()V PLcom/google/android/gms/measurement/internal/zzdc;->()V PLcom/google/android/gms/measurement/internal/zzdd;->()V PLcom/google/android/gms/measurement/internal/zzdd;->()V PLcom/google/android/gms/measurement/internal/zzde;->()V PLcom/google/android/gms/measurement/internal/zzde;->()V PLcom/google/android/gms/measurement/internal/zzdf;->()V PLcom/google/android/gms/measurement/internal/zzdf;->()V PLcom/google/android/gms/measurement/internal/zzdg;->()V PLcom/google/android/gms/measurement/internal/zzdg;->()V PLcom/google/android/gms/measurement/internal/zzdh;->()V PLcom/google/android/gms/measurement/internal/zzdh;->()V PLcom/google/android/gms/measurement/internal/zzdi;->()V PLcom/google/android/gms/measurement/internal/zzdi;->()V PLcom/google/android/gms/measurement/internal/zzdj;->()V PLcom/google/android/gms/measurement/internal/zzdj;->()V PLcom/google/android/gms/measurement/internal/zzdk;->()V PLcom/google/android/gms/measurement/internal/zzdk;->()V PLcom/google/android/gms/measurement/internal/zzdl;->()V PLcom/google/android/gms/measurement/internal/zzdl;->()V PLcom/google/android/gms/measurement/internal/zzdm;->()V PLcom/google/android/gms/measurement/internal/zzdm;->()V PLcom/google/android/gms/measurement/internal/zzdn;->()V PLcom/google/android/gms/measurement/internal/zzdn;->()V PLcom/google/android/gms/measurement/internal/zzdo;->()V PLcom/google/android/gms/measurement/internal/zzdo;->()V PLcom/google/android/gms/measurement/internal/zzdp;->()V PLcom/google/android/gms/measurement/internal/zzdp;->()V PLcom/google/android/gms/measurement/internal/zzdq;->()V PLcom/google/android/gms/measurement/internal/zzdq;->()V PLcom/google/android/gms/measurement/internal/zzdr;->()V PLcom/google/android/gms/measurement/internal/zzdr;->()V PLcom/google/android/gms/measurement/internal/zzds;->()V PLcom/google/android/gms/measurement/internal/zzds;->()V PLcom/google/android/gms/measurement/internal/zzdt;->()V PLcom/google/android/gms/measurement/internal/zzdt;->()V PLcom/google/android/gms/measurement/internal/zzdu;->()V PLcom/google/android/gms/measurement/internal/zzdu;->()V PLcom/google/android/gms/measurement/internal/zzdv;->()V PLcom/google/android/gms/measurement/internal/zzdv;->()V PLcom/google/android/gms/measurement/internal/zzdw;->()V PLcom/google/android/gms/measurement/internal/zzdw;->()V PLcom/google/android/gms/measurement/internal/zzdx;->()V PLcom/google/android/gms/measurement/internal/zzdx;->()V PLcom/google/android/gms/measurement/internal/zzdy;->()V PLcom/google/android/gms/measurement/internal/zzdy;->()V PLcom/google/android/gms/measurement/internal/zzdz;->()V PLcom/google/android/gms/measurement/internal/zzdz;->()V PLcom/google/android/gms/measurement/internal/zze;->(Lcom/google/android/gms/measurement/internal/zzd;JI)V PLcom/google/android/gms/measurement/internal/zze;->run()V PLcom/google/android/gms/measurement/internal/zzea;->()V PLcom/google/android/gms/measurement/internal/zzea;->()V PLcom/google/android/gms/measurement/internal/zzeb;->()V PLcom/google/android/gms/measurement/internal/zzeb;->()V PLcom/google/android/gms/measurement/internal/zzec;->()V PLcom/google/android/gms/measurement/internal/zzec;->()V PLcom/google/android/gms/measurement/internal/zzed;->()V PLcom/google/android/gms/measurement/internal/zzed;->()V PLcom/google/android/gms/measurement/internal/zzee;->()V PLcom/google/android/gms/measurement/internal/zzee;->()V PLcom/google/android/gms/measurement/internal/zzef;->()V PLcom/google/android/gms/measurement/internal/zzef;->()V PLcom/google/android/gms/measurement/internal/zzeh;->()V PLcom/google/android/gms/measurement/internal/zzeh;->()V PLcom/google/android/gms/measurement/internal/zzel;->()V PLcom/google/android/gms/measurement/internal/zzel;->(Ljava/lang/String;Ljava/lang/Object;Ljava/lang/Object;Lcom/google/android/gms/measurement/internal/zzej;Landroidx/navigation/R$id;)V PLcom/google/android/gms/measurement/internal/zzeo;->(Lcom/google/android/gms/measurement/internal/zzfw;)V PLcom/google/android/gms/measurement/internal/zzeo;->zza(Landroid/database/sqlite/SQLiteDatabase;)J PLcom/google/android/gms/measurement/internal/zzeo;->zzad()Z PLcom/google/android/gms/measurement/internal/zzeo;->zzae()Landroid/database/sqlite/SQLiteDatabase; PLcom/google/android/gms/measurement/internal/zzeo;->zzz()Z PLcom/google/android/gms/measurement/internal/zzep;->(Lcom/google/android/gms/measurement/internal/zzfw;J)V PLcom/google/android/gms/measurement/internal/zzep;->zzaa()V PLcom/google/android/gms/measurement/internal/zzep;->zzz()Z PLcom/google/android/gms/measurement/internal/zzeq;->()V PLcom/google/android/gms/measurement/internal/zzeq;->(Lcom/google/android/gms/measurement/internal/zzfw;)V PLcom/google/android/gms/measurement/internal/zzeq;->zzc(Ljava/lang/String;)Ljava/lang/String; PLcom/google/android/gms/measurement/internal/zzeq;->zze()Z PLcom/google/android/gms/measurement/internal/zzeq;->zzg()Z PLcom/google/android/gms/measurement/internal/zzes;->(Lcom/google/android/gms/measurement/internal/zzfw;)V PLcom/google/android/gms/measurement/internal/zzes;->zza(I)Z PLcom/google/android/gms/measurement/internal/zzes;->zza(IZZLjava/lang/String;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)V PLcom/google/android/gms/measurement/internal/zzes;->zza(ZLjava/lang/Object;)Ljava/lang/String; PLcom/google/android/gms/measurement/internal/zzes;->zza(ZLjava/lang/String;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/String; PLcom/google/android/gms/measurement/internal/zzes;->zzad()Ljava/lang/String; PLcom/google/android/gms/measurement/internal/zzes;->zze()Z PLcom/google/android/gms/measurement/internal/zzes;->zzx()Lcom/google/android/gms/measurement/internal/zzeu; PLcom/google/android/gms/measurement/internal/zzeu;->(Lcom/google/android/gms/measurement/internal/zzes;IZZ)V PLcom/google/android/gms/measurement/internal/zzeu;->zza(Ljava/lang/String;Ljava/lang/Object;)V PLcom/google/android/gms/measurement/internal/zzeu;->zza(Ljava/lang/String;Ljava/lang/Object;Ljava/lang/Object;)V PLcom/google/android/gms/measurement/internal/zzez;->(Lcom/google/android/gms/measurement/internal/zzka;)V PLcom/google/android/gms/measurement/internal/zzez;->zze()Z PLcom/google/android/gms/measurement/internal/zzez;->zzf()Z PLcom/google/android/gms/measurement/internal/zzf;->(Lcom/google/android/gms/measurement/internal/zzfw;Ljava/lang/String;)V PLcom/google/android/gms/measurement/internal/zzf;->zza(J)V PLcom/google/android/gms/measurement/internal/zzf;->zza(Ljava/lang/String;)V PLcom/google/android/gms/measurement/internal/zzf;->zza(Z)V PLcom/google/android/gms/measurement/internal/zzf;->zzaf()Z PLcom/google/android/gms/measurement/internal/zzf;->zzag()Z PLcom/google/android/gms/measurement/internal/zzf;->zzah()Ljava/lang/Boolean; PLcom/google/android/gms/measurement/internal/zzf;->zzb(J)V PLcom/google/android/gms/measurement/internal/zzf;->zzb(Z)V PLcom/google/android/gms/measurement/internal/zzf;->zzc()Ljava/lang/String; PLcom/google/android/gms/measurement/internal/zzf;->zzc(J)V PLcom/google/android/gms/measurement/internal/zzf;->zzc(Z)V PLcom/google/android/gms/measurement/internal/zzf;->zzd()Ljava/lang/String; PLcom/google/android/gms/measurement/internal/zzf;->zzd(J)V PLcom/google/android/gms/measurement/internal/zzf;->zze()Ljava/lang/String; PLcom/google/android/gms/measurement/internal/zzf;->zze(J)V PLcom/google/android/gms/measurement/internal/zzf;->zze(Ljava/lang/String;)V PLcom/google/android/gms/measurement/internal/zzf;->zzf()Ljava/lang/String; PLcom/google/android/gms/measurement/internal/zzf;->zzf(J)V PLcom/google/android/gms/measurement/internal/zzf;->zzf(Ljava/lang/String;)V PLcom/google/android/gms/measurement/internal/zzf;->zzg(J)V PLcom/google/android/gms/measurement/internal/zzf;->zzg(Ljava/lang/String;)V PLcom/google/android/gms/measurement/internal/zzf;->zzh()Ljava/lang/String; PLcom/google/android/gms/measurement/internal/zzf;->zzh(J)V PLcom/google/android/gms/measurement/internal/zzf;->zzh(Ljava/lang/String;)V PLcom/google/android/gms/measurement/internal/zzf;->zzi()Ljava/lang/String; PLcom/google/android/gms/measurement/internal/zzf;->zzi(J)V PLcom/google/android/gms/measurement/internal/zzf;->zzi(Ljava/lang/String;)V PLcom/google/android/gms/measurement/internal/zzf;->zzl()Ljava/lang/String; PLcom/google/android/gms/measurement/internal/zzf;->zzm()J PLcom/google/android/gms/measurement/internal/zzf;->zzn()Ljava/lang/String; PLcom/google/android/gms/measurement/internal/zzf;->zzo()J PLcom/google/android/gms/measurement/internal/zzf;->zzp()J PLcom/google/android/gms/measurement/internal/zzf;->zzq()J PLcom/google/android/gms/measurement/internal/zzf;->zzr()Z PLcom/google/android/gms/measurement/internal/zzfc;->()V PLcom/google/android/gms/measurement/internal/zzfc;->(Lcom/google/android/gms/measurement/internal/zzka;)V PLcom/google/android/gms/measurement/internal/zzfc;->zzb()V PLcom/google/android/gms/measurement/internal/zzfe;->()V PLcom/google/android/gms/measurement/internal/zzfe;->(Lcom/google/android/gms/measurement/internal/zzfw;)V PLcom/google/android/gms/measurement/internal/zzfe;->f_()V PLcom/google/android/gms/measurement/internal/zzfe;->zza(J)Z PLcom/google/android/gms/measurement/internal/zzfe;->zzb(Ljava/lang/String;)Ljava/lang/String; PLcom/google/android/gms/measurement/internal/zzfe;->zze()Z PLcom/google/android/gms/measurement/internal/zzfe;->zzg()Landroid/content/SharedPreferences; PLcom/google/android/gms/measurement/internal/zzfg;->(Lcom/google/android/gms/measurement/internal/zzfe;Ljava/lang/String;Z)V PLcom/google/android/gms/measurement/internal/zzfg;->zza()Z PLcom/google/android/gms/measurement/internal/zzfg;->zza(Z)V PLcom/google/android/gms/measurement/internal/zzfi;->(Lcom/google/android/gms/measurement/internal/zzfe;Ljava/lang/String;J)V PLcom/google/android/gms/measurement/internal/zzfi;->zza()J PLcom/google/android/gms/measurement/internal/zzfi;->zza(J)V PLcom/google/android/gms/measurement/internal/zzfl;->(Lcom/bumptech/glide/disklrucache/DiskLruCache;Ljava/lang/String;J[Ljava/io/File;[JLcom/google/firebase/iid/zzy;)V PLcom/google/android/gms/measurement/internal/zzfl;->(Lcom/google/android/gms/measurement/internal/zzfe;Ljava/lang/String;JLandroidx/core/R$id;)V PLcom/google/android/gms/measurement/internal/zzfl;->(Ljava/io/File;J)V PLcom/google/android/gms/measurement/internal/zzfl;->get(Lcom/bumptech/glide/load/Key;)Ljava/io/File; PLcom/google/android/gms/measurement/internal/zzfl;->getDiskCache()Lcom/bumptech/glide/disklrucache/DiskLruCache; PLcom/google/android/gms/measurement/internal/zzfl;->put(Lcom/bumptech/glide/load/Key;Lcom/bumptech/glide/load/engine/DataCacheWriter;)V PLcom/google/android/gms/measurement/internal/zzfq;->(Lcom/google/android/gms/measurement/internal/zzka;)V PLcom/google/android/gms/measurement/internal/zzfq;->zza(Lcom/google/android/gms/internal/measurement/zzbq$zzb;)Ljava/util/Map; PLcom/google/android/gms/measurement/internal/zzfq;->zza(Ljava/lang/String;Lcom/google/android/gms/internal/measurement/zzbq$zzb$zza;)V PLcom/google/android/gms/measurement/internal/zzfq;->zza(Ljava/lang/String;[B)Lcom/google/android/gms/internal/measurement/zzbq$zzb; PLcom/google/android/gms/measurement/internal/zzfq;->zzb(Ljava/lang/String;Ljava/lang/String;)Z PLcom/google/android/gms/measurement/internal/zzfq;->zzc(Ljava/lang/String;Ljava/lang/String;)Z PLcom/google/android/gms/measurement/internal/zzfq;->zze()Z PLcom/google/android/gms/measurement/internal/zzft;->()V PLcom/google/android/gms/measurement/internal/zzft;->(Lcom/google/android/gms/measurement/internal/zzfw;)V PLcom/google/android/gms/measurement/internal/zzft;->zza(Lcom/google/android/gms/measurement/internal/zzfu;)V PLcom/google/android/gms/measurement/internal/zzft;->zza(Ljava/lang/Runnable;)V PLcom/google/android/gms/measurement/internal/zzft;->zza(Ljava/util/concurrent/Callable;)Ljava/util/concurrent/Future; PLcom/google/android/gms/measurement/internal/zzft;->zze()Z PLcom/google/android/gms/measurement/internal/zzft;->zzg()Z PLcom/google/android/gms/measurement/internal/zzfu;->(Lcom/google/android/gms/measurement/internal/zzft;Ljava/lang/Runnable;Ljava/lang/String;)V PLcom/google/android/gms/measurement/internal/zzfu;->(Lcom/google/android/gms/measurement/internal/zzft;Ljava/util/concurrent/Callable;ZLjava/lang/String;)V PLcom/google/android/gms/measurement/internal/zzfu;->compareTo(Ljava/lang/Object;)I PLcom/google/android/gms/measurement/internal/zzfv;->(Lcom/google/android/gms/measurement/internal/zzft;Ljava/lang/String;)V PLcom/google/android/gms/measurement/internal/zzfw;->(Lcom/google/android/gms/measurement/internal/zzgy;)V PLcom/google/android/gms/measurement/internal/zzfw;->zza(Landroid/content/Context;Lcom/google/android/gms/internal/measurement/zzx;Ljava/lang/Long;)Lcom/google/android/gms/measurement/internal/zzfw; PLcom/google/android/gms/measurement/internal/zzfw;->zza(Landroidx/transition/ViewOverlayApi14;)V PLcom/google/android/gms/measurement/internal/zzfw;->zzab()Z PLcom/google/android/gms/measurement/internal/zzfw;->zzag()Z PLcom/google/android/gms/measurement/internal/zzfw;->zzb()Lcom/google/android/gms/measurement/internal/zzy; PLcom/google/android/gms/measurement/internal/zzfw;->zzb(Lcom/google/android/gms/measurement/internal/zzg;)V PLcom/google/android/gms/measurement/internal/zzfw;->zze()Lcom/google/android/gms/measurement/internal/zzjm; PLcom/google/android/gms/measurement/internal/zzfw;->zzh()Lcom/google/android/gms/measurement/internal/zzhb; PLcom/google/android/gms/measurement/internal/zzfw;->zzj()Lcom/google/android/gms/measurement/internal/zzeq; PLcom/google/android/gms/measurement/internal/zzfw;->zzl()Z PLcom/google/android/gms/measurement/internal/zzfw;->zzm()Lcom/google/android/gms/common/util/Clock; PLcom/google/android/gms/measurement/internal/zzfw;->zzn()Landroid/content/Context; PLcom/google/android/gms/measurement/internal/zzfw;->zzu()Lcom/google/firebase/auth/internal/zzaf; PLcom/google/android/gms/measurement/internal/zzfw;->zzv()Lcom/google/android/gms/measurement/internal/zzig; PLcom/google/android/gms/measurement/internal/zzfw;->zzw()Lcom/google/android/gms/measurement/internal/zzil; PLcom/google/android/gms/measurement/internal/zzfw;->zzx()Lcom/google/android/gms/measurement/internal/zzai; PLcom/google/android/gms/measurement/internal/zzfw;->zzy()Lcom/google/android/gms/measurement/internal/zzep; PLcom/google/android/gms/measurement/internal/zzfw;->zzz()Lcom/google/android/gms/measurement/internal/zza; PLcom/google/android/gms/measurement/internal/zzfx;->(Lcom/google/android/gms/measurement/internal/zzft;Ljava/lang/String;Ljava/util/concurrent/BlockingQueue;)V PLcom/google/android/gms/measurement/internal/zzfx;->run()V PLcom/google/android/gms/measurement/internal/zzg;->(Lcom/google/android/gms/measurement/internal/zzfw;)V PLcom/google/android/gms/measurement/internal/zzg;->zzw()V PLcom/google/android/gms/measurement/internal/zzg;->zzx()V PLcom/google/android/gms/measurement/internal/zzga;->(Lcom/google/android/gms/measurement/internal/zzgb;Lcom/google/android/gms/measurement/internal/zzn;I)V PLcom/google/android/gms/measurement/internal/zzga;->run()V PLcom/google/android/gms/measurement/internal/zzgb;->(Lcom/google/android/gms/measurement/internal/zzka;)V PLcom/google/android/gms/measurement/internal/zzgb;->zza(JLjava/lang/String;Ljava/lang/String;Ljava/lang/String;)V PLcom/google/android/gms/measurement/internal/zzgb;->zza(Lcom/google/android/gms/measurement/internal/zzao;Lcom/google/android/gms/measurement/internal/zzn;)V PLcom/google/android/gms/measurement/internal/zzgb;->zza(Lcom/google/android/gms/measurement/internal/zzkh;Lcom/google/android/gms/measurement/internal/zzn;)V PLcom/google/android/gms/measurement/internal/zzgb;->zza(Lcom/google/android/gms/measurement/internal/zzn;)V PLcom/google/android/gms/measurement/internal/zzgb;->zza(Ljava/lang/Runnable;)V PLcom/google/android/gms/measurement/internal/zzgb;->zza(Ljava/lang/String;Z)V PLcom/google/android/gms/measurement/internal/zzgb;->zzb(Lcom/google/android/gms/measurement/internal/zzn;)V PLcom/google/android/gms/measurement/internal/zzgb;->zzb1(Lcom/google/android/gms/measurement/internal/zzn;)V PLcom/google/android/gms/measurement/internal/zzgb;->zzc(Lcom/google/android/gms/measurement/internal/zzn;)Ljava/lang/String; PLcom/google/android/gms/measurement/internal/zzgp;->(Ljava/lang/Object;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Object;JI)V PLcom/google/android/gms/measurement/internal/zzgp;->run()V PLcom/google/android/gms/measurement/internal/zzgq;->(Lcom/google/android/gms/measurement/internal/zzfw;)V PLcom/google/android/gms/measurement/internal/zzgq;->zzaa()V PLcom/google/android/gms/measurement/internal/zzgq;->zzab()V PLcom/google/android/gms/measurement/internal/zzgq;->zzac()V PLcom/google/android/gms/measurement/internal/zzgy;->(Landroid/content/Context;Lcom/google/android/gms/internal/measurement/zzx;Ljava/lang/Long;)V PLcom/google/android/gms/measurement/internal/zzhb;->(Lcom/google/android/gms/measurement/internal/zzfw;)V PLcom/google/android/gms/measurement/internal/zzhb;->zza(Lcom/google/android/gms/measurement/internal/zzgz;)V PLcom/google/android/gms/measurement/internal/zzhb;->zza(Ljava/lang/String;Ljava/lang/String;JLandroid/os/Bundle;)V PLcom/google/android/gms/measurement/internal/zzhb;->zza(Ljava/lang/String;Ljava/lang/String;JLjava/lang/Object;)V PLcom/google/android/gms/measurement/internal/zzhb;->zza(Ljava/lang/String;Ljava/lang/String;Landroid/os/Bundle;)V PLcom/google/android/gms/measurement/internal/zzhb;->zza(Ljava/lang/String;Ljava/lang/String;Landroid/os/Bundle;ZZJ)V PLcom/google/android/gms/measurement/internal/zzhb;->zza(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Object;J)V PLcom/google/android/gms/measurement/internal/zzhb;->zza(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Object;ZJ)V PLcom/google/android/gms/measurement/internal/zzhb;->zzab()V PLcom/google/android/gms/measurement/internal/zzhb;->zzai()V PLcom/google/android/gms/measurement/internal/zzhb;->zzam()V PLcom/google/android/gms/measurement/internal/zzhb;->zzz()Z PLcom/google/android/gms/measurement/internal/zzhe;->(Lcom/google/android/gms/measurement/internal/zzhb;Ljava/lang/String;Ljava/lang/String;JLandroid/os/Bundle;ZZZLjava/lang/String;)V PLcom/google/android/gms/measurement/internal/zzhe;->run()V PLcom/google/android/gms/measurement/internal/zzhs;->(Ljava/lang/Object;ZI)V PLcom/google/android/gms/measurement/internal/zzhs;->run()V PLcom/google/android/gms/measurement/internal/zzhw;->(Lcom/google/android/gms/measurement/internal/zzhb;Lcom/google/android/gms/measurement/internal/zzhc;)V PLcom/google/android/gms/measurement/internal/zzhw;->(Ljava/lang/Object;I)V PLcom/google/android/gms/measurement/internal/zzhw;->onActivityCreated(Landroid/app/Activity;Landroid/os/Bundle;)V PLcom/google/android/gms/measurement/internal/zzhw;->onActivityDestroyed(Landroid/app/Activity;)V PLcom/google/android/gms/measurement/internal/zzhw;->onActivityPaused(Landroid/app/Activity;)V PLcom/google/android/gms/measurement/internal/zzhw;->onActivityResumed(Landroid/app/Activity;)V PLcom/google/android/gms/measurement/internal/zzhw;->onActivitySaveInstanceState(Landroid/app/Activity;Landroid/os/Bundle;)V PLcom/google/android/gms/measurement/internal/zzhw;->onActivityStarted(Landroid/app/Activity;)V PLcom/google/android/gms/measurement/internal/zzhw;->onActivityStopped(Landroid/app/Activity;)V PLcom/google/android/gms/measurement/internal/zzib;->(Lcom/google/android/gms/measurement/internal/zzfw;)V PLcom/google/android/gms/measurement/internal/zzib;->zze()Z PLcom/google/android/gms/measurement/internal/zzif;->(Lcom/google/android/gms/measurement/internal/zzka;I)V PLcom/google/android/gms/measurement/internal/zzif;->zza(JJ)Z PLcom/google/android/gms/measurement/internal/zzif;->zza(Lcom/google/android/gms/internal/measurement/zzgp;[B)Lcom/google/android/gms/internal/measurement/zzgp; PLcom/google/android/gms/measurement/internal/zzif;->zza(Lcom/google/android/gms/measurement/internal/zzao;Lcom/google/android/gms/measurement/internal/zzn;)Z PLcom/google/android/gms/measurement/internal/zzif;->zza([B)J PLcom/google/android/gms/measurement/internal/zzif;->zze()Z PLcom/google/android/gms/measurement/internal/zzif;->zzf()Ljava/util/List; PLcom/google/android/gms/measurement/internal/zzig;->(Lcom/google/android/gms/measurement/internal/zzfw;)V PLcom/google/android/gms/measurement/internal/zzig;->zza(Landroid/app/Activity;Landroid/os/Bundle;)V PLcom/google/android/gms/measurement/internal/zzig;->zza(Landroid/app/Activity;Lcom/google/android/gms/measurement/internal/zzih;Z)V PLcom/google/android/gms/measurement/internal/zzig;->zza(Landroid/app/Activity;Ljava/lang/String;Ljava/lang/String;)V PLcom/google/android/gms/measurement/internal/zzig;->zza(Lcom/google/android/gms/measurement/internal/zzig;Lcom/google/android/gms/measurement/internal/zzih;ZJ)V PLcom/google/android/gms/measurement/internal/zzig;->zza(Lcom/google/android/gms/measurement/internal/zzih;Landroid/os/Bundle;Z)V PLcom/google/android/gms/measurement/internal/zzig;->zza(Ljava/lang/String;)Ljava/lang/String; PLcom/google/android/gms/measurement/internal/zzig;->zza(Ljava/lang/String;Lcom/google/android/gms/measurement/internal/zzih;)V PLcom/google/android/gms/measurement/internal/zzig;->zzab()Lcom/google/android/gms/measurement/internal/zzih; PLcom/google/android/gms/measurement/internal/zzig;->zzd(Landroid/app/Activity;)Lcom/google/android/gms/measurement/internal/zzih; PLcom/google/android/gms/measurement/internal/zzig;->zzz()Z PLcom/google/android/gms/measurement/internal/zzih;->(Ljava/lang/String;Ljava/lang/String;J)V PLcom/google/android/gms/measurement/internal/zzij;->(Lcom/google/android/gms/measurement/internal/zzig;ZJLcom/google/android/gms/measurement/internal/zzih;Lcom/google/android/gms/measurement/internal/zzih;)V PLcom/google/android/gms/measurement/internal/zzij;->run()V PLcom/google/android/gms/measurement/internal/zzik;->(Ljava/lang/Object;Lcom/google/android/gms/measurement/internal/zzgt;I)V PLcom/google/android/gms/measurement/internal/zzik;->zza()V PLcom/google/android/gms/measurement/internal/zzil;->(Lcom/google/android/gms/measurement/internal/zzfw;)V PLcom/google/android/gms/measurement/internal/zzil;->zza(Ljava/lang/Runnable;)V PLcom/google/android/gms/measurement/internal/zzil;->zzab()Z PLcom/google/android/gms/measurement/internal/zzil;->zzah()V PLcom/google/android/gms/measurement/internal/zzil;->zzak()V PLcom/google/android/gms/measurement/internal/zzil;->zzal()Z PLcom/google/android/gms/measurement/internal/zzil;->zzan()V PLcom/google/android/gms/measurement/internal/zzil;->zzz()Z PLcom/google/android/gms/measurement/internal/zzin;->(Lcom/google/android/gms/measurement/internal/zzil;ZLcom/google/android/gms/measurement/internal/zzkh;Lcom/google/android/gms/measurement/internal/zzn;)V PLcom/google/android/gms/measurement/internal/zzin;->run()V PLcom/google/android/gms/measurement/internal/zzip;->(Lcom/google/android/gms/measurement/internal/zzil;Lcom/google/android/gms/measurement/internal/zzn;I)V PLcom/google/android/gms/measurement/internal/zzip;->run()V PLcom/google/android/gms/measurement/internal/zziw;->(Lcom/google/android/gms/measurement/internal/zzil;ZZLcom/google/android/gms/common/internal/safeparcel/AbstractSafeParcelable;Lcom/google/android/gms/measurement/internal/zzn;Ljava/lang/Object;I)V PLcom/google/android/gms/measurement/internal/zziw;->run()V PLcom/google/android/gms/measurement/internal/zzjc;->(Lcom/google/android/gms/measurement/internal/zzjd;Lcom/google/android/gms/measurement/internal/zzek;I)V PLcom/google/android/gms/measurement/internal/zzjc;->run()V PLcom/google/android/gms/measurement/internal/zzjd;->(Lcom/google/android/gms/measurement/internal/zzil;)V PLcom/google/android/gms/measurement/internal/zzjd;->onServiceConnected(Landroid/content/ComponentName;Landroid/os/IBinder;)V PLcom/google/android/gms/measurement/internal/zzjm;->(Lcom/google/android/gms/measurement/internal/zzfw;)V PLcom/google/android/gms/measurement/internal/zzjm;->zza(ZZJ)Z PLcom/google/android/gms/measurement/internal/zzjm;->zzab()V PLcom/google/android/gms/measurement/internal/zzjm;->zzz()Z PLcom/google/android/gms/measurement/internal/zzjq;->(Landroidx/lifecycle/ViewModelProvider;JJ)V PLcom/google/android/gms/measurement/internal/zzjs;->(Lcom/google/android/gms/measurement/internal/zzjm;)V PLcom/google/android/gms/measurement/internal/zzjs;->zza(ZZJ)Z PLcom/google/android/gms/measurement/internal/zzjw;->(Lcom/google/android/gms/measurement/internal/zzka;)V PLcom/google/android/gms/measurement/internal/zzjw;->zze()Z PLcom/google/android/gms/measurement/internal/zzjw;->zzf()V PLcom/google/android/gms/measurement/internal/zzjw;->zzv()I PLcom/google/android/gms/measurement/internal/zzjw;->zzw()Landroid/app/PendingIntent; PLcom/google/android/gms/measurement/internal/zzjz;->(Lcom/google/android/gms/measurement/internal/zzjw;Lcom/google/android/gms/measurement/internal/zzgt;Lcom/google/android/gms/measurement/internal/zzka;)V PLcom/google/android/gms/measurement/internal/zzka;->(Landroidx/appcompat/view/ActionBarPolicy;)V PLcom/google/android/gms/measurement/internal/zzka;->zza(Landroid/content/Context;)Lcom/google/android/gms/measurement/internal/zzka; PLcom/google/android/gms/measurement/internal/zzka;->zza(Lcom/google/android/gms/measurement/internal/zzkh;Lcom/google/android/gms/measurement/internal/zzn;)V PLcom/google/android/gms/measurement/internal/zzka;->zzb(Lcom/google/android/gms/measurement/internal/zzn;)V PLcom/google/android/gms/measurement/internal/zzka;->zzc()Lcom/google/android/gms/measurement/internal/zzfq; PLcom/google/android/gms/measurement/internal/zzka;->zzd()Lcom/google/android/gms/measurement/internal/zzez; PLcom/google/android/gms/measurement/internal/zzka;->zze(Lcom/google/android/gms/measurement/internal/zzn;)Z PLcom/google/android/gms/measurement/internal/zzka;->zzk()V PLcom/google/android/gms/measurement/internal/zzka;->zzo()V PLcom/google/android/gms/measurement/internal/zzka;->zzq()Lcom/google/android/gms/measurement/internal/zzft; PLcom/google/android/gms/measurement/internal/zzka;->zzt()Lcom/google/android/gms/measurement/internal/zzfc; PLcom/google/android/gms/measurement/internal/zzka;->zzv()Lcom/google/android/gms/measurement/internal/zzjw; PLcom/google/android/gms/measurement/internal/zzka;->zzw()V PLcom/google/android/gms/measurement/internal/zzka;->zzx()J PLcom/google/android/gms/measurement/internal/zzka;->zzy()Z PLcom/google/android/gms/measurement/internal/zzkb;->(Lcom/google/android/gms/measurement/internal/zzka;)V PLcom/google/android/gms/measurement/internal/zzkb;->zzak()V PLcom/google/android/gms/measurement/internal/zzkb;->zzal()V PLcom/google/android/gms/measurement/internal/zzkb;->zzg()Lcom/google/android/gms/measurement/internal/zzif; PLcom/google/android/gms/measurement/internal/zzkb;->zzi()Lcom/google/android/gms/measurement/internal/zzad; PLcom/google/android/gms/measurement/internal/zzkh;->()V PLcom/google/android/gms/measurement/internal/zzkh;->(ILjava/lang/String;JLjava/lang/Long;Ljava/lang/Float;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Double;)V PLcom/google/android/gms/measurement/internal/zzkh;->(Ljava/lang/String;JLjava/lang/Object;Ljava/lang/String;)V PLcom/google/android/gms/measurement/internal/zzkh;->writeToParcel(Landroid/os/Parcel;I)V PLcom/google/android/gms/measurement/internal/zzkh;->zza()Ljava/lang/Object; PLcom/google/android/gms/measurement/internal/zzkj;->(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;JLjava/lang/Object;)V PLcom/google/android/gms/measurement/internal/zzkm;->()V PLcom/google/android/gms/measurement/internal/zzkm;->(Lcom/google/android/gms/measurement/internal/zzfw;)V PLcom/google/android/gms/measurement/internal/zzkm;->f_()V PLcom/google/android/gms/measurement/internal/zzkm;->zza(Landroid/content/Context;)Z PLcom/google/android/gms/measurement/internal/zzkm;->zza(Landroid/os/Bundle;)Landroid/os/Bundle; PLcom/google/android/gms/measurement/internal/zzkm;->zza(Landroid/os/Bundle;Ljava/lang/String;Ljava/lang/Object;)V PLcom/google/android/gms/measurement/internal/zzkm;->zza(Ljava/lang/Object;)Z PLcom/google/android/gms/measurement/internal/zzkm;->zza(Ljava/lang/String;)Z PLcom/google/android/gms/measurement/internal/zzkm;->zza(Ljava/lang/String;ILjava/lang/String;)Z PLcom/google/android/gms/measurement/internal/zzkm;->zza(Ljava/lang/String;IZ)Ljava/lang/String; PLcom/google/android/gms/measurement/internal/zzkm;->zza(Ljava/lang/String;Ljava/lang/Object;)Ljava/lang/Object; PLcom/google/android/gms/measurement/internal/zzkm;->zza(Ljava/lang/String;Ljava/lang/String;)Z PLcom/google/android/gms/measurement/internal/zzkm;->zza(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Z PLcom/google/android/gms/measurement/internal/zzkm;->zza(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Z PLcom/google/android/gms/measurement/internal/zzkm;->zza(Ljava/lang/String;[Ljava/lang/String;)Z PLcom/google/android/gms/measurement/internal/zzkm;->zza(Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;)Z PLcom/google/android/gms/measurement/internal/zzkm;->zza([B)J PLcom/google/android/gms/measurement/internal/zzkm;->zzb(Landroid/content/Context;Ljava/lang/String;)Z PLcom/google/android/gms/measurement/internal/zzkm;->zzb(Ljava/lang/Object;)[Landroid/os/Bundle; PLcom/google/android/gms/measurement/internal/zzkm;->zzb(Ljava/lang/String;)I PLcom/google/android/gms/measurement/internal/zzkm;->zzb(Ljava/lang/String;Ljava/lang/Object;)I PLcom/google/android/gms/measurement/internal/zzkm;->zzc(Ljava/lang/String;)I PLcom/google/android/gms/measurement/internal/zzkm;->zzc(Ljava/lang/String;Ljava/lang/Object;)Ljava/lang/Object; PLcom/google/android/gms/measurement/internal/zzkm;->zzc(Ljava/lang/String;Ljava/lang/String;)Z PLcom/google/android/gms/measurement/internal/zzkm;->zzd(Ljava/lang/String;)Z PLcom/google/android/gms/measurement/internal/zzkm;->zze()Z PLcom/google/android/gms/measurement/internal/zzkm;->zze(Ljava/lang/String;)Z PLcom/google/android/gms/measurement/internal/zzkm;->zzf(Ljava/lang/String;)Z PLcom/google/android/gms/measurement/internal/zzkm;->zzg()J PLcom/google/android/gms/measurement/internal/zzkm;->zzh()Ljava/security/SecureRandom; PLcom/google/android/gms/measurement/internal/zzkm;->zzh(Ljava/lang/String;)I PLcom/google/android/gms/measurement/internal/zzkm;->zzi()Ljava/security/MessageDigest; PLcom/google/android/gms/measurement/internal/zzkm;->zzi(Ljava/lang/String;)I PLcom/google/android/gms/measurement/internal/zzkm;->zzk(Ljava/lang/String;)I PLcom/google/android/gms/measurement/internal/zzn;->()V PLcom/google/android/gms/measurement/internal/zzo;->(Lcom/google/android/gms/measurement/internal/zzka;)V PLcom/google/android/gms/measurement/internal/zzo;->zze()Z PLcom/google/android/gms/measurement/internal/zzt;->(Lcom/google/firebase/crashlytics/internal/common/CrashlyticsController;Ljava/lang/String;Ljava/lang/String;J)V PLcom/google/android/gms/measurement/internal/zzt;->writeTo(Lcom/google/firebase/crashlytics/internal/proto/CodedOutputStream;)V PLcom/google/android/gms/measurement/internal/zzy;->(Lcom/google/android/gms/measurement/internal/zzfw;)V PLcom/google/android/gms/measurement/internal/zzy;->zza(Ljava/lang/String;Lcom/google/android/gms/measurement/internal/zzel;)J PLcom/google/android/gms/measurement/internal/zzy;->zza(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; PLcom/google/android/gms/measurement/internal/zzy;->zzb(Ljava/lang/String;Lcom/google/android/gms/measurement/internal/zzel;)I PLcom/google/android/gms/measurement/internal/zzy;->zze()I PLcom/google/android/gms/measurement/internal/zzy;->zze(Ljava/lang/String;Lcom/google/android/gms/measurement/internal/zzel;)Z PLcom/google/android/gms/measurement/internal/zzy;->zzh()Z PLcom/google/android/gms/measurement/internal/zzy;->zzi()Ljava/lang/Boolean; PLcom/google/android/gms/measurement/internal/zzy;->zzj()Ljava/lang/Boolean; PLcom/google/android/gms/measurement/internal/zzy;->zzy()Z PLcom/google/android/gms/signin/SignInOptions;->()V PLcom/google/android/gms/signin/SignInOptions;->()V PLcom/google/android/gms/signin/zaa;->(I)V PLcom/google/android/gms/signin/zaa;->buildClient(Landroid/content/Context;Landroid/os/Looper;Lcom/google/android/gms/common/internal/ClientSettings;Ljava/lang/Object;Lcom/google/android/gms/common/api/GoogleApiClient$ConnectionCallbacks;Lcom/google/android/gms/common/api/GoogleApiClient$OnConnectionFailedListener;)Lcom/google/android/gms/common/api/Api$Client; PLcom/google/android/gms/signin/zaa;->buildClient(Landroid/content/Context;Landroid/os/Looper;Lcom/google/android/gms/common/internal/ClientSettings;Ljava/lang/Object;Lcom/google/android/gms/common/api/internal/ConnectionCallbacks;Lcom/google/android/gms/common/api/internal/OnConnectionFailedListener;)Lcom/google/android/gms/common/api/Api$Client; PLcom/google/android/gms/stats/zza;->(I)V PLcom/google/android/gms/stats/zza;->(Landroidx/appcompat/widget/SearchView$4;)V PLcom/google/android/gms/stats/zza;->(Lkotlin/ResultKt;)V PLcom/google/android/gms/stats/zza;->(Lokhttp3/RequestBody;)V PLcom/google/android/gms/stats/zza;->calculateScaleY(FF)F PLcom/google/android/gms/stats/zza;->closeLogFile()V PLcom/google/android/gms/stats/zza;->getExpiresAtFrom(Lcom/google/android/gms/stats/zza;JLorg/json/JSONObject;)J PLcom/google/android/gms/tasks/Task;->()V PLcom/google/android/gms/tasks/TaskCompletionSource;->()V PLcom/google/android/gms/tasks/TaskCompletionSource;->trySetResult(Ljava/lang/Object;)Z PLcom/google/android/gms/tasks/TaskExecutors;->()V PLcom/google/android/gms/tasks/zzc;->(Ljava/util/concurrent/Executor;Lcom/google/android/gms/tasks/Continuation;Lcom/google/android/gms/tasks/zzu;I)V PLcom/google/android/gms/tasks/zzc;->onComplete(Lcom/google/android/gms/tasks/Task;)V PLcom/google/android/gms/tasks/zzd;->(Ljava/lang/Object;Ljava/lang/Object;I)V PLcom/google/android/gms/tasks/zzd;->(Ljava/lang/Object;Ljava/lang/Object;ILandroidx/appcompat/R$id$$IA$1;)V PLcom/google/android/gms/tasks/zzg;->(Ljava/util/concurrent/Executor;Lcom/google/android/gms/tasks/OnCompleteListener;)V PLcom/google/android/gms/tasks/zzg;->(Ljava/util/concurrent/Executor;Lcom/google/android/gms/tasks/SuccessContinuation;Lcom/google/android/gms/tasks/zzu;)V PLcom/google/android/gms/tasks/zzg;->onComplete(Lcom/google/android/gms/tasks/Task;)V PLcom/google/android/gms/tasks/zzr;->(I)V PLcom/google/android/gms/tasks/zzr;->(Landroid/content/Context;)V PLcom/google/android/gms/tasks/zzr;->clearRemoveAndMaybeRecycle(Lcom/bumptech/glide/request/Request;Z)Z PLcom/google/android/gms/tasks/zzr;->pauseRequests()V PLcom/google/android/gms/tasks/zzr;->resumeRequests()V PLcom/google/android/gms/tasks/zzr;->runRequest(Lcom/bumptech/glide/request/Request;)V PLcom/google/android/gms/tasks/zzt;->(I)V PLcom/google/android/gms/tasks/zzt;->execute(Ljava/lang/Runnable;)V PLcom/google/android/gms/tasks/zzu;->()V PLcom/google/android/gms/tasks/zzu;->continueWith(Lcom/google/android/gms/tasks/Continuation;)Lcom/google/android/gms/tasks/Task; PLcom/google/android/gms/tasks/zzu;->continueWith(Ljava/util/concurrent/Executor;Lcom/google/android/gms/tasks/Continuation;)Lcom/google/android/gms/tasks/Task; PLcom/google/android/gms/tasks/zzu;->getResult()Ljava/lang/Object; PLcom/google/android/gms/tasks/zzu;->isSuccessful()Z PLcom/google/android/gms/tasks/zzu;->onSuccessTask(Ljava/util/concurrent/Executor;Lcom/google/android/gms/tasks/SuccessContinuation;)Lcom/google/android/gms/tasks/Task; PLcom/google/android/gms/tasks/zzu;->setResult(Ljava/lang/Object;)V PLcom/google/android/gms/tasks/zzu;->zze()V PLcom/google/android/material/animation/AnimationUtils;->()V PLcom/google/android/material/animation/AnimationUtils;->lerp(FFF)F PLcom/google/android/material/animation/AnimationUtils;->lerp(FFFFF)F PLcom/google/android/material/appbar/AppBarLayout$BaseBehavior;->()V PLcom/google/android/material/appbar/AppBarLayout$BaseBehavior;->onSaveInstanceState(Landroidx/coordinatorlayout/widget/CoordinatorLayout;Landroid/view/View;)Landroid/os/Parcelable; PLcom/google/android/material/appbar/AppBarLayout$BaseBehavior;->onStartNestedScroll(Landroidx/coordinatorlayout/widget/CoordinatorLayout;Landroid/view/View;Landroid/view/View;Landroid/view/View;II)Z PLcom/google/android/material/appbar/AppBarLayout$Behavior;->()V PLcom/google/android/material/appbar/AppBarLayout$LayoutParams;->(Landroid/content/Context;Landroid/util/AttributeSet;)V PLcom/google/android/material/appbar/AppBarLayout$ScrollingViewBehavior;->(Landroid/content/Context;Landroid/util/AttributeSet;)V PLcom/google/android/material/appbar/AppBarLayout$ScrollingViewBehavior;->onDependentViewChanged(Landroidx/coordinatorlayout/widget/CoordinatorLayout;Landroid/view/View;Landroid/view/View;)Z PLcom/google/android/material/appbar/AppBarLayout;->(Landroid/content/Context;Landroid/util/AttributeSet;)V PLcom/google/android/material/appbar/AppBarLayout;->checkLayoutParams(Landroid/view/ViewGroup$LayoutParams;)Z PLcom/google/android/material/appbar/AppBarLayout;->draw(Landroid/graphics/Canvas;)V PLcom/google/android/material/appbar/AppBarLayout;->drawableStateChanged()V PLcom/google/android/material/appbar/AppBarLayout;->generateLayoutParams(Landroid/util/AttributeSet;)Landroid/view/ViewGroup$LayoutParams; PLcom/google/android/material/appbar/AppBarLayout;->getBehavior()Landroidx/coordinatorlayout/widget/CoordinatorLayout$Behavior; PLcom/google/android/material/appbar/AppBarLayout;->getPendingAction()I PLcom/google/android/material/appbar/AppBarLayout;->onAttachedToWindow()V PLcom/google/android/material/appbar/AppBarLayout;->onCreateDrawableState(I)[I PLcom/google/android/material/appbar/AppBarLayout;->onDetachedFromWindow()V PLcom/google/android/material/appbar/AppBarLayout;->onOffsetChanged(I)V PLcom/google/android/material/appbar/AppBarLayout;->setElevation(F)V PLcom/google/android/material/appbar/AppBarLayout;->setLiftedState(Z)Z PLcom/google/android/material/appbar/AppBarLayout;->setOrientation(I)V PLcom/google/android/material/appbar/AppBarLayout;->setStatusBarForeground(Landroid/graphics/drawable/Drawable;)V PLcom/google/android/material/appbar/AppBarLayout;->updateWillNotDraw()V PLcom/google/android/material/appbar/AppBarLayout;->verifyDrawable(Landroid/graphics/drawable/Drawable;)Z PLcom/google/android/material/appbar/HeaderBehavior;->()V PLcom/google/android/material/appbar/HeaderBehavior;->onInterceptTouchEvent(Landroidx/coordinatorlayout/widget/CoordinatorLayout;Landroid/view/View;Landroid/view/MotionEvent;)Z PLcom/google/android/material/appbar/HeaderBehavior;->onTouchEvent(Landroidx/coordinatorlayout/widget/CoordinatorLayout;Landroid/view/View;Landroid/view/MotionEvent;)Z PLcom/google/android/material/appbar/HeaderScrollingViewBehavior;->(Landroid/content/Context;Landroid/util/AttributeSet;)V PLcom/google/android/material/appbar/HeaderScrollingViewBehavior;->getOverlapPixelsForOffset(Landroid/view/View;)I PLcom/google/android/material/appbar/ViewOffsetBehavior;->()V PLcom/google/android/material/appbar/ViewOffsetBehavior;->(Landroid/content/Context;Landroid/util/AttributeSet;)V PLcom/google/android/material/appbar/ViewOffsetBehavior;->getTopAndBottomOffset()I PLcom/google/android/material/appbar/ViewOffsetBehavior;->layoutChild(Landroidx/coordinatorlayout/widget/CoordinatorLayout;Landroid/view/View;I)V PLcom/google/android/material/appbar/ViewOffsetHelper;->(Landroid/view/View;)V PLcom/google/android/material/appbar/ViewOffsetHelper;->setTopAndBottomOffset(I)Z PLcom/google/android/material/bottomnavigation/BottomNavigationItemView;->(Landroid/content/Context;)V PLcom/google/android/material/bottomnavigation/BottomNavigationItemView;->getItemDefaultMarginResId()I PLcom/google/android/material/bottomnavigation/BottomNavigationItemView;->getItemLayoutResId()I PLcom/google/android/material/bottomnavigation/BottomNavigationMenuView;->(Landroid/content/Context;)V PLcom/google/android/material/bottomnavigation/BottomNavigationMenuView;->createNavigationBarItemView(Landroid/content/Context;)Lcom/google/android/material/navigation/NavigationBarItemView; PLcom/google/android/material/bottomnavigation/BottomNavigationMenuView;->onLayout(ZIIII)V PLcom/google/android/material/bottomnavigation/BottomNavigationView;->(Landroid/content/Context;Landroid/util/AttributeSet;)V PLcom/google/android/material/bottomnavigation/BottomNavigationView;->createNavigationBarMenuView(Landroid/content/Context;)Lcom/google/android/material/navigation/NavigationBarMenuView; PLcom/google/android/material/bottomnavigation/BottomNavigationView;->getMaxItemCount()I PLcom/google/android/material/bottomnavigation/BottomNavigationView;->onMeasure(II)V PLcom/google/android/material/bottomnavigation/BottomNavigationView;->setItemHorizontalTranslationEnabled(Z)V PLcom/google/android/material/button/MaterialButton$SavedState;->()V PLcom/google/android/material/button/MaterialButton$SavedState;->(Landroid/os/Parcelable;)V PLcom/google/android/material/button/MaterialButton$SavedState;->writeToParcel(Landroid/os/Parcel;I)V PLcom/google/android/material/button/MaterialButton;->()V PLcom/google/android/material/button/MaterialButton;->isCheckable()Z PLcom/google/android/material/button/MaterialButton;->isChecked()Z PLcom/google/android/material/button/MaterialButton;->isIconEnd()Z PLcom/google/android/material/button/MaterialButton;->isIconStart()Z PLcom/google/android/material/button/MaterialButton;->isIconTop()Z PLcom/google/android/material/button/MaterialButton;->isUsingOriginalBackground()Z PLcom/google/android/material/button/MaterialButton;->onAttachedToWindow()V PLcom/google/android/material/button/MaterialButton;->onCreateDrawableState(I)[I PLcom/google/android/material/button/MaterialButton;->onSaveInstanceState()Landroid/os/Parcelable; PLcom/google/android/material/button/MaterialButton;->onTextChanged(Ljava/lang/CharSequence;III)V PLcom/google/android/material/button/MaterialButton;->refreshDrawableState()V PLcom/google/android/material/button/MaterialButton;->setBackgroundTintList(Landroid/content/res/ColorStateList;)V PLcom/google/android/material/button/MaterialButton;->setInternalBackground(Landroid/graphics/drawable/Drawable;)V PLcom/google/android/material/button/MaterialButton;->setSupportBackgroundTintList(Landroid/content/res/ColorStateList;)V PLcom/google/android/material/button/MaterialButton;->updateIcon(Z)V PLcom/google/android/material/button/MaterialButton;->updateIconPosition(II)V PLcom/google/android/material/button/MaterialButtonHelper;->(Lcom/google/android/material/button/MaterialButton;Lcom/google/android/material/shape/ShapeAppearanceModel;)V PLcom/google/android/material/button/MaterialButtonHelper;->getMaterialShapeDrawable()Lcom/google/android/material/shape/MaterialShapeDrawable; PLcom/google/android/material/button/MaterialButtonHelper;->getMaterialShapeDrawable(Z)Lcom/google/android/material/shape/MaterialShapeDrawable; PLcom/google/android/material/datepicker/CalendarStyle;->(Landroidx/constraintlayout/widget/ConstraintLayout;Lcom/google/android/material/bottomnavigation/BottomNavigationView;Landroid/widget/FrameLayout;Landroidx/fragment/app/FragmentContainerView;Lcom/google/android/material/navigationrail/NavigationRailView;Landroidx/constraintlayout/widget/ConstraintLayout;Lcom/google/samples/apps/iosched/widget/FadingSnackbar;Landroid/view/View;)V PLcom/google/android/material/datepicker/YearGridAdapter$1;->(Ljava/lang/Object;II)V PLcom/google/android/material/elevation/ElevationOverlayProvider;->()V PLcom/google/android/material/elevation/ElevationOverlayProvider;->(Landroid/content/Context;)V PLcom/google/android/material/elevation/ElevationOverlayProvider;->compositeOverlayIfNeeded(IF)I PLcom/google/android/material/internal/BaselineLayout;->(Landroid/content/Context;Landroid/util/AttributeSet;)V PLcom/google/android/material/internal/BaselineLayout;->onLayout(ZIIII)V PLcom/google/android/material/internal/CheckableImageButton;->()V PLcom/google/android/material/internal/CheckableImageButton;->(Landroid/content/Context;Landroid/util/AttributeSet;)V PLcom/google/android/material/internal/CheckableImageButton;->isChecked()Z PLcom/google/android/material/internal/CheckableImageButton;->setPressed(Z)V PLcom/google/android/material/internal/ParcelableSparseArray;->()V PLcom/google/android/material/internal/ParcelableSparseArray;->()V PLcom/google/android/material/internal/ParcelableSparseArray;->writeToParcel(Landroid/os/Parcel;I)V PLcom/google/android/material/internal/TextScale$1;->(Ljava/lang/Object;Ljava/lang/Object;I)V PLcom/google/android/material/internal/TextScale;->()V PLcom/google/android/material/internal/ViewUtils$RelativePadding;->()V PLcom/google/android/material/internal/ViewUtils$RelativePadding;->(IIII)V PLcom/google/android/material/internal/ViewUtils$RelativePadding;->(Lcom/google/android/material/internal/ViewUtils$RelativePadding;)V PLcom/google/android/material/internal/ViewUtils$RelativePadding;->setFrom(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;)Lcom/google/android/material/internal/ViewUtils$RelativePadding; PLcom/google/android/material/navigation/NavigationBarItemView$ActiveIndicatorUnlabeledTransform;->(Landroidx/appcompat/widget/SearchView$4;)V PLcom/google/android/material/navigation/NavigationBarItemView;->()V PLcom/google/android/material/navigation/NavigationBarItemView;->calculateTextScaleFactors(FF)V PLcom/google/android/material/navigation/NavigationBarItemView;->getIconOrContainer()Landroid/view/View; PLcom/google/android/material/navigation/NavigationBarItemView;->getItemBackgroundResId()I PLcom/google/android/material/navigation/NavigationBarItemView;->getItemVisiblePosition()I PLcom/google/android/material/navigation/NavigationBarItemView;->getSuggestedIconHeight()I PLcom/google/android/material/navigation/NavigationBarItemView;->getSuggestedIconWidth()I PLcom/google/android/material/navigation/NavigationBarItemView;->getSuggestedMinimumHeight()I PLcom/google/android/material/navigation/NavigationBarItemView;->getSuggestedMinimumWidth()I PLcom/google/android/material/navigation/NavigationBarItemView;->hasBadge()Z PLcom/google/android/material/navigation/NavigationBarItemView;->onSizeChanged(IIII)V PLcom/google/android/material/navigation/NavigationBarItemView;->refreshChecked()V PLcom/google/android/material/navigation/NavigationBarItemView;->setActiveIndicatorDrawable(Landroid/graphics/drawable/Drawable;)V PLcom/google/android/material/navigation/NavigationBarItemView;->setActiveIndicatorEnabled(Z)V PLcom/google/android/material/navigation/NavigationBarItemView;->setActiveIndicatorHeight(I)V PLcom/google/android/material/navigation/NavigationBarItemView;->setActiveIndicatorMarginHorizontal(I)V PLcom/google/android/material/navigation/NavigationBarItemView;->setActiveIndicatorProgress(FF)V PLcom/google/android/material/navigation/NavigationBarItemView;->setActiveIndicatorResizeable(Z)V PLcom/google/android/material/navigation/NavigationBarItemView;->setActiveIndicatorWidth(I)V PLcom/google/android/material/navigation/NavigationBarItemView;->setCheckable(Z)V PLcom/google/android/material/navigation/NavigationBarItemView;->setEnabled(Z)V PLcom/google/android/material/navigation/NavigationBarItemView;->setIcon(Landroid/graphics/drawable/Drawable;)V PLcom/google/android/material/navigation/NavigationBarItemView;->setIconSize(I)V PLcom/google/android/material/navigation/NavigationBarItemView;->setIconTintList(Landroid/content/res/ColorStateList;)V PLcom/google/android/material/navigation/NavigationBarItemView;->setItemBackground(Landroid/graphics/drawable/Drawable;)V PLcom/google/android/material/navigation/NavigationBarItemView;->setItemPaddingBottom(I)V PLcom/google/android/material/navigation/NavigationBarItemView;->setItemPaddingTop(I)V PLcom/google/android/material/navigation/NavigationBarItemView;->setItemPosition(I)V PLcom/google/android/material/navigation/NavigationBarItemView;->setLabelVisibilityMode(I)V PLcom/google/android/material/navigation/NavigationBarItemView;->setShifting(Z)V PLcom/google/android/material/navigation/NavigationBarItemView;->setTextAppearanceActive(I)V PLcom/google/android/material/navigation/NavigationBarItemView;->setTextAppearanceInactive(I)V PLcom/google/android/material/navigation/NavigationBarItemView;->setTextColor(Landroid/content/res/ColorStateList;)V PLcom/google/android/material/navigation/NavigationBarItemView;->setTitle(Ljava/lang/CharSequence;)V PLcom/google/android/material/navigation/NavigationBarItemView;->setViewTopMarginAndGravity(Landroid/view/View;II)V PLcom/google/android/material/navigation/NavigationBarItemView;->updateViewPaddingBottom(Landroid/view/View;I)V PLcom/google/android/material/navigation/NavigationBarMenu;->(Landroid/content/Context;Ljava/lang/Class;I)V PLcom/google/android/material/navigation/NavigationBarMenu;->addInternal(IIILjava/lang/CharSequence;)Landroid/view/MenuItem; PLcom/google/android/material/navigation/NavigationBarMenuView;->()V PLcom/google/android/material/navigation/NavigationBarMenuView;->(Landroid/content/Context;)V PLcom/google/android/material/navigation/NavigationBarMenuView;->createDefaultColorStateList(I)Landroid/content/res/ColorStateList; PLcom/google/android/material/navigation/NavigationBarMenuView;->createItemActiveIndicatorDrawable()Landroid/graphics/drawable/Drawable; PLcom/google/android/material/navigation/NavigationBarMenuView;->getBadgeDrawables()Landroid/util/SparseArray; PLcom/google/android/material/navigation/NavigationBarMenuView;->getLabelVisibilityMode()I PLcom/google/android/material/navigation/NavigationBarMenuView;->getMenu()Landroidx/appcompat/view/menu/MenuBuilder; PLcom/google/android/material/navigation/NavigationBarMenuView;->getNewItem()Lcom/google/android/material/navigation/NavigationBarItemView; PLcom/google/android/material/navigation/NavigationBarMenuView;->getSelectedItemId()I PLcom/google/android/material/navigation/NavigationBarMenuView;->isShifting(II)Z PLcom/google/android/material/navigation/NavigationBarMenuView;->onInitializeAccessibilityNodeInfo(Landroid/view/accessibility/AccessibilityNodeInfo;)V PLcom/google/android/material/navigation/NavigationBarMenuView;->setBadgeIfNeeded(Lcom/google/android/material/navigation/NavigationBarItemView;)V PLcom/google/android/material/navigation/NavigationBarMenuView;->setIconTintList(Landroid/content/res/ColorStateList;)V PLcom/google/android/material/navigation/NavigationBarMenuView;->setItemBackground(Landroid/graphics/drawable/Drawable;)V PLcom/google/android/material/navigation/NavigationBarMenuView;->setItemIconSize(I)V PLcom/google/android/material/navigation/NavigationBarMenuView;->setItemPaddingBottom(I)V PLcom/google/android/material/navigation/NavigationBarMenuView;->setItemPaddingTop(I)V PLcom/google/android/material/navigation/NavigationBarMenuView;->setItemTextAppearanceActive(I)V PLcom/google/android/material/navigation/NavigationBarMenuView;->setItemTextAppearanceInactive(I)V PLcom/google/android/material/navigation/NavigationBarMenuView;->setItemTextColor(Landroid/content/res/ColorStateList;)V PLcom/google/android/material/navigation/NavigationBarMenuView;->setLabelVisibilityMode(I)V PLcom/google/android/material/navigation/NavigationBarMenuView;->setPresenter(Lcom/google/android/material/navigation/NavigationBarPresenter;)V PLcom/google/android/material/navigation/NavigationBarPresenter$SavedState;->()V PLcom/google/android/material/navigation/NavigationBarPresenter$SavedState;->()V PLcom/google/android/material/navigation/NavigationBarPresenter$SavedState;->writeToParcel(Landroid/os/Parcel;I)V PLcom/google/android/material/navigation/NavigationBarPresenter;->()V PLcom/google/android/material/navigation/NavigationBarPresenter;->getId()I PLcom/google/android/material/navigation/NavigationBarPresenter;->initForMenu(Landroid/content/Context;Landroidx/appcompat/view/menu/MenuBuilder;)V PLcom/google/android/material/navigation/NavigationBarPresenter;->onSaveInstanceState()Landroid/os/Parcelable; PLcom/google/android/material/navigation/NavigationBarPresenter;->updateMenuView(Z)V PLcom/google/android/material/navigation/NavigationBarView$SavedState;->()V PLcom/google/android/material/navigation/NavigationBarView$SavedState;->(Landroid/os/Parcelable;)V PLcom/google/android/material/navigation/NavigationBarView$SavedState;->writeToParcel(Landroid/os/Parcel;I)V PLcom/google/android/material/navigation/NavigationBarView;->(Landroid/content/Context;Landroid/util/AttributeSet;II)V PLcom/google/android/material/navigation/NavigationBarView;->getMenu()Landroid/view/Menu; PLcom/google/android/material/navigation/NavigationBarView;->getMenuInflater()Landroid/view/MenuInflater; PLcom/google/android/material/navigation/NavigationBarView;->getMenuView()Landroidx/appcompat/view/menu/MenuView; PLcom/google/android/material/navigation/NavigationBarView;->onAttachedToWindow()V PLcom/google/android/material/navigation/NavigationBarView;->onSaveInstanceState()Landroid/os/Parcelable; PLcom/google/android/material/navigation/NavigationBarView;->setElevation(F)V PLcom/google/android/material/navigation/NavigationBarView;->setItemIconSize(I)V PLcom/google/android/material/navigation/NavigationBarView;->setItemPaddingBottom(I)V PLcom/google/android/material/navigation/NavigationBarView;->setItemPaddingTop(I)V PLcom/google/android/material/navigation/NavigationBarView;->setItemRippleColor(Landroid/content/res/ColorStateList;)V PLcom/google/android/material/navigation/NavigationBarView;->setItemTextAppearanceActive(I)V PLcom/google/android/material/navigation/NavigationBarView;->setItemTextAppearanceInactive(I)V PLcom/google/android/material/navigation/NavigationBarView;->setItemTextColor(Landroid/content/res/ColorStateList;)V PLcom/google/android/material/navigation/NavigationBarView;->setLabelVisibilityMode(I)V PLcom/google/android/material/navigation/NavigationBarView;->setOnItemReselectedListener(Lcom/google/android/material/navigation/NavigationBarView$OnItemReselectedListener;)V PLcom/google/android/material/navigation/NavigationBarView;->setOnItemSelectedListener(Lcom/google/android/material/navigation/NavigationBarView$OnItemSelectedListener;)V PLcom/google/android/material/shadow/ShadowRenderer;->()V PLcom/google/android/material/shape/AbsoluteCornerSize;->(F)V PLcom/google/android/material/shape/AbsoluteCornerSize;->getCornerSize(Landroid/graphics/RectF;)F PLcom/google/android/material/shape/AdjustedCornerSize;->(FLcom/google/android/material/shape/CornerSize;)V PLcom/google/android/material/shape/AdjustedCornerSize;->getCornerSize(Landroid/graphics/RectF;)F PLcom/google/android/material/shape/MaterialShapeDrawable$MaterialShapeDrawableState;->newDrawable()Landroid/graphics/drawable/Drawable; PLcom/google/android/material/shape/MaterialShapeDrawable;->()V PLcom/google/android/material/shape/MaterialShapeDrawable;->()V PLcom/google/android/material/shape/MaterialShapeDrawable;->(Lcom/google/android/material/shape/ShapeAppearanceModel;)V PLcom/google/android/material/shape/MaterialShapeDrawable;->calculatePath(Landroid/graphics/RectF;Landroid/graphics/Path;)V PLcom/google/android/material/shape/MaterialShapeDrawable;->calculatePathForSize(Landroid/graphics/RectF;Landroid/graphics/Path;)V PLcom/google/android/material/shape/MaterialShapeDrawable;->compositeElevationOverlayIfNeeded(I)I PLcom/google/android/material/shape/MaterialShapeDrawable;->getConstantState()Landroid/graphics/drawable/Drawable$ConstantState; PLcom/google/android/material/shape/MaterialShapeDrawable;->getOpacity()I PLcom/google/android/material/shape/MaterialShapeDrawable;->getOutline(Landroid/graphics/Outline;)V PLcom/google/android/material/shape/MaterialShapeDrawable;->getPadding(Landroid/graphics/Rect;)Z PLcom/google/android/material/shape/MaterialShapeDrawable;->getStrokeInsetLength()F PLcom/google/android/material/shape/MaterialShapeDrawable;->getTopLeftCornerResolvedSize()F PLcom/google/android/material/shape/MaterialShapeDrawable;->initializeElevationOverlay(Landroid/content/Context;)V PLcom/google/android/material/shape/MaterialShapeDrawable;->invalidateSelf()V PLcom/google/android/material/shape/MaterialShapeDrawable;->mutate()Landroid/graphics/drawable/Drawable; PLcom/google/android/material/shape/MaterialShapeDrawable;->onBoundsChange(Landroid/graphics/Rect;)V PLcom/google/android/material/shape/MaterialShapeDrawable;->onStateChange([I)Z PLcom/google/android/material/shape/MaterialShapeDrawable;->setColorFilter(Landroid/graphics/ColorFilter;)V PLcom/google/android/material/shape/MaterialShapeDrawable;->setElevation(F)V PLcom/google/android/material/shape/MaterialShapeDrawable;->setFillColor(Landroid/content/res/ColorStateList;)V PLcom/google/android/material/shape/MaterialShapeDrawable;->setStroke(FI)V PLcom/google/android/material/shape/MaterialShapeDrawable;->setStroke(FLandroid/content/res/ColorStateList;)V PLcom/google/android/material/shape/MaterialShapeDrawable;->setStrokeColor(Landroid/content/res/ColorStateList;)V PLcom/google/android/material/shape/MaterialShapeDrawable;->setTint(I)V PLcom/google/android/material/shape/MaterialShapeDrawable;->setTintList(Landroid/content/res/ColorStateList;)V PLcom/google/android/material/shape/MaterialShapeDrawable;->setTintMode(Landroid/graphics/PorterDuff$Mode;)V PLcom/google/android/material/shape/MaterialShapeDrawable;->updateColorsForState([I)Z PLcom/google/android/material/shape/MaterialShapeDrawable;->updateZ()V PLcom/google/android/material/shape/RelativeCornerSize;->(F)V PLcom/google/android/material/shape/RoundedCornerTreatment;->()V PLcom/google/android/material/shape/RoundedCornerTreatment;->getCornerPath(Lcom/google/android/material/shape/ShapePath;FFF)V PLcom/google/android/material/shape/ShapeAppearanceModel$Builder;->()V PLcom/google/android/material/shape/ShapeAppearanceModel$Builder;->(Lcom/google/android/material/shape/ShapeAppearanceModel;)V PLcom/google/android/material/shape/ShapeAppearanceModel$Builder;->build()Lcom/google/android/material/shape/ShapeAppearanceModel; PLcom/google/android/material/shape/ShapeAppearanceModel$Builder;->compatCornerTreatmentSize(Landroidx/core/R$dimen;)F PLcom/google/android/material/shape/ShapeAppearanceModel;->()V PLcom/google/android/material/shape/ShapeAppearanceModel;->()V PLcom/google/android/material/shape/ShapeAppearanceModel;->builder(Landroid/content/Context;IILcom/google/android/material/shape/CornerSize;)Lcom/google/android/material/shape/ShapeAppearanceModel$Builder; PLcom/google/android/material/shape/ShapeAppearanceModel;->builder(Landroid/content/Context;Landroid/util/AttributeSet;II)Lcom/google/android/material/shape/ShapeAppearanceModel$Builder; PLcom/google/android/material/shape/ShapeAppearanceModel;->builder(Landroid/content/Context;Landroid/util/AttributeSet;IILcom/google/android/material/shape/CornerSize;)Lcom/google/android/material/shape/ShapeAppearanceModel$Builder; PLcom/google/android/material/shape/ShapeAppearanceModel;->getCornerSize(Landroid/content/res/TypedArray;ILcom/google/android/material/shape/CornerSize;)Lcom/google/android/material/shape/CornerSize; PLcom/google/android/material/shape/ShapeAppearancePathProvider$Lazy;->()V PLcom/google/android/material/shape/ShapeAppearancePathProvider;->()V PLcom/google/android/material/shape/ShapePath$1;->(Lcom/google/android/material/shape/ShapePath;Ljava/util/List;Landroid/graphics/Matrix;)V PLcom/google/android/material/shape/ShapePath$ArcShadowOperation;->(Lcom/google/android/material/shape/ShapePath$PathArcOperation;)V PLcom/google/android/material/shape/ShapePath$LineShadowOperation;->(Lcom/google/android/material/shape/ShapePath$PathLineOperation;FF)V PLcom/google/android/material/shape/ShapePath$LineShadowOperation;->getAngle()F PLcom/google/android/material/shape/ShapePath$PathArcOperation;->()V PLcom/google/android/material/shape/ShapePath$PathArcOperation;->(FFFF)V PLcom/google/android/material/shape/ShapePath$PathArcOperation;->applyToPath(Landroid/graphics/Matrix;Landroid/graphics/Path;)V PLcom/google/android/material/shape/ShapePath$PathLineOperation;->()V PLcom/google/android/material/shape/ShapePath$PathLineOperation;->applyToPath(Landroid/graphics/Matrix;Landroid/graphics/Path;)V PLcom/google/android/material/shape/ShapePath$PathOperation;->()V PLcom/google/android/material/shape/ShapePath$ShadowCompatOperation;->()V PLcom/google/android/material/shape/ShapePath$ShadowCompatOperation;->()V PLcom/google/android/material/shape/ShapePath;->()V PLcom/google/android/material/shape/ShapePath;->addConnectingShadowIfNecessary(F)V PLcom/google/android/material/textview/MaterialTextView;->setTextAppearance(Landroid/content/Context;I)V PLcom/google/android/material/theme/MaterialComponentsViewInflater;->()V PLcom/google/android/material/theme/MaterialComponentsViewInflater;->createButton(Landroid/content/Context;Landroid/util/AttributeSet;)Landroidx/appcompat/widget/AppCompatButton; PLcom/google/ar/core/ArCoreApk$Availability;->()V PLcom/google/ar/core/ArCoreApk$Availability;->(Ljava/lang/String;II)V PLcom/google/ar/core/ArCoreApk$Availability;->(Ljava/lang/String;IILcom/google/ar/core/aj;)V PLcom/google/ar/core/ArCoreApk$Availability;->isTransient()Z PLcom/google/ar/core/ArCoreApk;->()V PLcom/google/ar/core/ArCoreApk;->getInstance()Lcom/google/ar/core/ArCoreApk; PLcom/google/ar/core/a;->(Ljava/lang/String;)V PLcom/google/ar/core/a;->isUnknown()Z PLcom/google/ar/core/ab;->()V PLcom/google/ar/core/ac;->()V PLcom/google/ar/core/ac;->(Ljava/lang/Object;I)V PLcom/google/ar/core/ac;->encode(Ljava/lang/Object;)Ljava/lang/String; PLcom/google/ar/core/ac;->encode(Ljava/lang/Object;Ljava/io/Writer;)V PLcom/google/ar/core/ac;->onComplete(Lcom/google/android/gms/tasks/Task;)V PLcom/google/ar/core/ac;->onEvent(Ljava/lang/String;Landroid/os/Bundle;)V PLcom/google/ar/core/ac;->registerBreadcrumbHandler(Lio/grpc/Attributes$Key;)V PLcom/google/ar/core/ac;->serializeEvent(Ljava/lang/String;Landroid/os/Bundle;)Ljava/lang/String; PLcom/google/ar/core/ac;->then(Lcom/google/android/gms/tasks/Task;)Ljava/lang/Object; PLcom/google/ar/core/aj;->(Lcom/google/ar/core/h;)V PLcom/google/ar/core/aj;->a(Lcom/google/ar/core/ArCoreApk$Availability;)V PLcom/google/ar/core/ap;->(Ljava/lang/Object;Ljava/lang/Object;IILandroidx/appcompat/R$id$$IA$1;)V PLcom/google/ar/core/ap;->run()V PLcom/google/ar/core/b;->(Ljava/lang/String;)V PLcom/google/ar/core/c;->(Ljava/lang/String;)V PLcom/google/ar/core/d;->(Ljava/lang/String;)V PLcom/google/ar/core/e;->(Ljava/lang/String;)V PLcom/google/ar/core/f;->(Ljava/lang/String;)V PLcom/google/ar/core/g;->(Ljava/lang/String;)V PLcom/google/ar/core/h;->()V PLcom/google/ar/core/h;->()V PLcom/google/ar/core/h;->a(Landroid/content/Context;)Lcom/google/ar/core/o; PLcom/google/ar/core/h;->b(Landroid/content/Context;)Z PLcom/google/ar/core/h;->checkAvailability(Landroid/content/Context;)Lcom/google/ar/core/ArCoreApk$Availability; PLcom/google/ar/core/h;->d(Landroid/content/Context;)I PLcom/google/ar/core/h;->e(Landroid/content/Context;)V PLcom/google/ar/core/n;->(Ljava/lang/Object;I)V PLcom/google/ar/core/n;->onAnimationCancel(Landroid/animation/Animator;)V PLcom/google/ar/core/n;->onAnimationEnd(Landroid/animation/Animator;)V PLcom/google/ar/core/n;->onAnimationStart(Landroid/animation/Animator;)V PLcom/google/ar/core/o;->(B)V PLcom/google/ar/core/o;->a(Landroid/content/Context;)V PLcom/google/ar/core/o;->a(Landroid/content/Context;Lcom/google/ar/core/ArCoreApk$a;)V PLcom/google/ar/core/o;->a(Ljava/lang/Runnable;)V PLcom/google/ar/core/q;->(I)V PLcom/google/ar/core/s;->(Ljava/lang/Object;I)V PLcom/google/ar/core/t;->(Lcom/google/ar/core/o;Landroid/content/Context;Lcom/google/ar/core/ArCoreApk$a;)V PLcom/google/ar/core/w;->(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;I)V PLcom/google/ar/core/y;->(Ljava/lang/Object;Ljava/lang/Object;ILandroidx/appcompat/R$id$$IA$1;)V PLcom/google/ar/core/y;->run()V PLcom/google/common/base/Splitter;->(I)V PLcom/google/common/base/Splitter;->build()Lcom/google/common/collect/ImmutableMap; PLcom/google/common/base/Splitter;->ensureCapacity(I)V PLcom/google/common/base/Splitter;->put(Ljava/lang/Object;Ljava/lang/Object;)Lcom/google/common/base/Splitter; PLcom/google/common/collect/ImmutableCollection;->()V PLcom/google/common/collect/ImmutableCollection;->()V PLcom/google/common/collect/ImmutableMap;->()V PLcom/google/common/collect/ImmutableSet;->()V PLcom/google/common/collect/ImmutableSet;->chooseTableSize(I)I PLcom/google/common/collect/ImmutableSet;->construct(I[Ljava/lang/Object;)Lcom/google/common/collect/ImmutableSet; PLcom/google/common/collect/Maps;->()V PLcom/google/common/collect/Maps;->get(Ljava/lang/Class;)Ljava/lang/Object; PLcom/google/common/collect/Maps;->getFontFamilyResult(Landroid/content/Context;Landroidx/core/provider/FontRequest;Landroid/os/CancellationSignal;)Landroidx/appcompat/app/AlertDialog$Builder; PLcom/google/common/collect/Maps;->resolveBoolean(Landroid/content/Context;IZ)Z PLcom/google/common/collect/Maps;->setOf(Ljava/lang/Class;)Ljava/util/Set; PLcom/google/common/collect/RegularImmutableMap;->()V PLcom/google/common/collect/RegularImmutableMap;->([I[Ljava/lang/Object;I)V PLcom/google/common/collect/RegularImmutableMap;->get(Ljava/lang/Object;)Ljava/lang/Object; PLcom/google/common/collect/RegularImmutableSet;->()V PLcom/google/common/collect/RegularImmutableSet;->([Ljava/lang/Object;I[Ljava/lang/Object;II)V PLcom/google/common/collect/RegularImmutableSet;->contains(Ljava/lang/Object;)Z PLcom/google/common/collect/RegularImmutableSet;->size()I PLcom/google/firebase/FirebaseApp$$Lambda$1;->(Lcom/google/firebase/FirebaseApp;Landroid/content/Context;)V PLcom/google/firebase/FirebaseApp$$Lambda$1;->get()Ljava/lang/Object; PLcom/google/firebase/FirebaseApp$GlobalBackgroundStateListener;->()V PLcom/google/firebase/FirebaseApp$GlobalBackgroundStateListener;->()V PLcom/google/firebase/FirebaseApp$GlobalBackgroundStateListener;->onBackgroundStateChanged(Z)V PLcom/google/firebase/FirebaseApp$UiExecutor;->()V PLcom/google/firebase/FirebaseApp$UiExecutor;->(Lkotlin/ResultKt;)V PLcom/google/firebase/FirebaseApp;->()V PLcom/google/firebase/FirebaseApp;->(Landroid/content/Context;Ljava/lang/String;Lcom/google/firebase/FirebaseOptions;)V PLcom/google/firebase/FirebaseApp;->getInstance()Lcom/google/firebase/FirebaseApp; PLcom/google/firebase/FirebaseApp;->initializeAllApis()V PLcom/google/firebase/FirebaseApp;->initializeApp(Landroid/content/Context;Lcom/google/firebase/FirebaseOptions;)Lcom/google/firebase/FirebaseApp; PLcom/google/firebase/FirebaseApp;->isDataCollectionDefaultEnabled()Z PLcom/google/firebase/FirebaseApp;->isDefaultApp()Z PLcom/google/firebase/FirebaseException;->()V PLcom/google/firebase/FirebaseOptions;->(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V PLcom/google/firebase/FirebaseOptions;->fromResource(Landroid/content/Context;)Lcom/google/firebase/FirebaseOptions; PLcom/google/firebase/abt/FirebaseABTesting;->(Lcom/google/firebase/analytics/connector/AnalyticsConnector;Ljava/lang/String;)V PLcom/google/firebase/abt/component/AbtComponent;->(Landroid/content/Context;Lcom/google/firebase/analytics/connector/AnalyticsConnector;)V PLcom/google/firebase/abt/component/AbtRegistrar;->()V PLcom/google/firebase/abt/component/AbtRegistrar;->getComponents()Ljava/util/List; PLcom/google/firebase/abt/component/AbtRegistrar;->lambda$getComponents$0(Lcom/google/firebase/components/ComponentContainer;)Lcom/google/firebase/abt/component/AbtComponent; PLcom/google/firebase/analytics/FirebaseAnalytics;->(Lcom/google/android/gms/internal/measurement/zzz;)V PLcom/google/firebase/analytics/FirebaseAnalytics;->getFirebaseInstanceId()Ljava/lang/String; PLcom/google/firebase/analytics/FirebaseAnalytics;->getInstance(Landroid/content/Context;)Lcom/google/firebase/analytics/FirebaseAnalytics; PLcom/google/firebase/analytics/FirebaseAnalytics;->getScionFrontendApiImplementation(Landroid/content/Context;Landroid/os/Bundle;)Lcom/google/android/gms/measurement/internal/zzhy; PLcom/google/firebase/analytics/FirebaseAnalytics;->logEvent(Ljava/lang/String;Landroid/os/Bundle;)V PLcom/google/firebase/analytics/FirebaseAnalytics;->setCurrentScreen(Landroid/app/Activity;Ljava/lang/String;Ljava/lang/String;)V PLcom/google/firebase/analytics/FirebaseAnalytics;->setUserProperty(Ljava/lang/String;Ljava/lang/String;)V PLcom/google/firebase/analytics/connector/AnalyticsConnectorImpl;->(Lcom/google/android/gms/measurement/AppMeasurement;)V PLcom/google/firebase/analytics/connector/AnalyticsConnectorImpl;->registerAnalyticsConnectorListener(Ljava/lang/String;Lio/grpc/CallOptions$Key;)Landroidx/compose/runtime/SnapshotThreadLocal; PLcom/google/firebase/analytics/connector/internal/AnalyticsConnectorRegistrar;->()V PLcom/google/firebase/analytics/connector/internal/AnalyticsConnectorRegistrar;->getComponents()Ljava/util/List; PLcom/google/firebase/analytics/connector/internal/zzb;->()V PLcom/google/firebase/analytics/connector/internal/zzb;->zza(Ljava/lang/String;)Z PLcom/google/firebase/analytics/connector/internal/zzd;->(Ljava/lang/Object;I)V PLcom/google/firebase/analytics/connector/internal/zzd;->onEvent(Ljava/lang/String;Ljava/lang/String;Landroid/os/Bundle;J)V PLcom/google/firebase/analytics/connector/zza;->()V PLcom/google/firebase/analytics/connector/zza;->()V PLcom/google/firebase/analytics/ktx/AnalyticsKt;->()V PLcom/google/firebase/analytics/ktx/FirebaseAnalyticsKtxRegistrar;->()V PLcom/google/firebase/analytics/ktx/FirebaseAnalyticsKtxRegistrar;->getComponents()Ljava/util/List; PLcom/google/firebase/analytics/zzb;->(Lcom/google/android/gms/internal/measurement/zzz;)V PLcom/google/firebase/auth/FirebaseAuth;->(Lcom/google/firebase/FirebaseApp;)V PLcom/google/firebase/auth/FirebaseAuthRegistrar;->()V PLcom/google/firebase/auth/FirebaseAuthRegistrar;->getComponents()Ljava/util/List; PLcom/google/firebase/auth/api/internal/zzal;->(Lcom/google/android/gms/common/api/GoogleApi;Lcom/google/android/gms/common/api/GoogleApi;Lokhttp3/internal/http2/Huffman$Node;)V PLcom/google/firebase/auth/api/internal/zzaq;->()V PLcom/google/firebase/auth/api/internal/zzaq;->(Landroid/content/Context;Lcom/google/android/gms/common/api/Api;Lcom/google/android/gms/common/api/Api$ApiOptions;Lcom/google/android/gms/common/api/internal/StatusExceptionMapper;)V PLcom/google/firebase/auth/api/internal/zzau;->()V PLcom/google/firebase/auth/api/internal/zzau;->(Landroid/content/Context;Lcom/google/firebase/auth/api/internal/zzeu;)V PLcom/google/firebase/auth/api/internal/zzau;->zza()Ljava/util/concurrent/Future; PLcom/google/firebase/auth/api/internal/zzed;->(Lcom/google/firebase/auth/api/internal/zzeu;Landroid/content/Context;)V PLcom/google/firebase/auth/api/internal/zzed;->call()Ljava/lang/Object; PLcom/google/firebase/auth/api/internal/zzed;->zza(ZLandroid/content/Context;)Lcom/google/android/gms/common/api/GoogleApi; PLcom/google/firebase/auth/api/internal/zzei;->()V PLcom/google/firebase/auth/api/internal/zzei;->(Landroid/content/Context;Landroid/os/Looper;Lcom/google/android/gms/common/internal/ClientSettings;Lcom/google/firebase/auth/api/internal/zzeu;Lcom/google/android/gms/common/api/internal/ConnectionCallbacks;Lcom/google/android/gms/common/api/internal/OnConnectionFailedListener;)V PLcom/google/firebase/auth/api/internal/zzei;->getMinApkVersion()I PLcom/google/firebase/auth/api/internal/zzei;->requiresGooglePlayServices()Z PLcom/google/firebase/auth/api/internal/zzet;->()V PLcom/google/firebase/auth/api/internal/zzeu;->(Ljava/lang/String;Lcom/google/android/gms/signin/zaa;)V PLcom/google/firebase/auth/api/internal/zzeu;->clone()Ljava/lang/Object; PLcom/google/firebase/auth/api/internal/zzeu;->hashCode()I PLcom/google/firebase/auth/internal/zzaf;->()V PLcom/google/firebase/auth/internal/zzaf;->(Z)V PLcom/google/firebase/auth/internal/zzao;->()V PLcom/google/firebase/auth/internal/zzao;->()V PLcom/google/firebase/auth/internal/zzau;->()V PLcom/google/firebase/auth/internal/zzau;->()V PLcom/google/firebase/auth/internal/zzaw;->(Landroid/content/Context;Ljava/lang/String;)V PLcom/google/firebase/auth/internal/zzay;->(Ljava/lang/Object;I)V PLcom/google/firebase/auth/internal/zzay;->onBackgroundStateChanged(Z)V PLcom/google/firebase/auth/internal/zzbb;->()V PLcom/google/firebase/auth/internal/zzbb;->()V PLcom/google/firebase/auth/internal/zzl;->(Lcom/google/firebase/FirebaseApp;)V PLcom/google/firebase/auth/zzaa;->(I)V PLcom/google/firebase/auth/zzaa;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object; PLcom/google/firebase/auth/zzl;->(Ljava/lang/Object;I)V PLcom/google/firebase/auth/zzl;->checkUpdatedTable()Ljava/util/Set; PLcom/google/firebase/auth/zzl;->run()V PLcom/google/firebase/components/Component$Builder;->(Ljava/lang/Class;[Ljava/lang/Class;Landroidx/transition/Styleable;)V PLcom/google/firebase/components/Component$Builder;->add(Lcom/google/firebase/components/Dependency;)Lcom/google/firebase/components/Component$Builder; PLcom/google/firebase/components/Component$Builder;->build()Lcom/google/firebase/components/Component; PLcom/google/firebase/components/Component$Builder;->factory(Lcom/google/firebase/components/ComponentFactory;)Lcom/google/firebase/components/Component$Builder; PLcom/google/firebase/components/Component$Builder;->setInstantiation(I)Lcom/google/firebase/components/Component$Builder; PLcom/google/firebase/components/Component;->(Ljava/util/Set;Ljava/util/Set;IILcom/google/firebase/components/ComponentFactory;Ljava/util/Set;Landroidx/transition/Styleable;)V PLcom/google/firebase/components/Component;->builder(Ljava/lang/Class;)Lcom/google/firebase/components/Component$Builder; PLcom/google/firebase/components/Component;->isValue()Z PLcom/google/firebase/components/Component;->of(Ljava/lang/Object;Ljava/lang/Class;[Ljava/lang/Class;)Lcom/google/firebase/components/Component; PLcom/google/firebase/components/ComponentRuntime$$Lambda$1;->(Lcom/google/firebase/components/ComponentRuntime;Lcom/google/firebase/components/Component;)V PLcom/google/firebase/components/ComponentRuntime$$Lambda$1;->get()Ljava/lang/Object; PLcom/google/firebase/components/ComponentRuntime$$Lambda$4;->(Ljava/util/Set;)V PLcom/google/firebase/components/ComponentRuntime$$Lambda$4;->get()Ljava/lang/Object; PLcom/google/firebase/components/ComponentRuntime;->(Ljava/util/concurrent/Executor;Ljava/lang/Iterable;[Lcom/google/firebase/components/Component;)V PLcom/google/firebase/components/ComponentRuntime;->getProvider(Ljava/lang/Class;)Lcom/google/firebase/inject/Provider; PLcom/google/firebase/components/ComponentRuntime;->setOfProvider(Ljava/lang/Class;)Lcom/google/firebase/inject/Provider; PLcom/google/firebase/components/CycleDetector$ComponentNode;->(Lcom/google/firebase/components/Component;)V PLcom/google/firebase/components/CycleDetector$ComponentNode;->isRoot()Z PLcom/google/firebase/components/CycleDetector$Dep;->(Ljava/lang/Class;ZLandroidx/transition/Styleable;)V PLcom/google/firebase/components/CycleDetector$Dep;->equals(Ljava/lang/Object;)Z PLcom/google/firebase/components/CycleDetector$Dep;->hashCode()I PLcom/google/firebase/components/Dependency;->(Ljava/lang/Class;II)V PLcom/google/firebase/components/Dependency;->hashCode()I PLcom/google/firebase/components/Dependency;->isSet()Z PLcom/google/firebase/components/EventBus;->(Ljava/util/concurrent/Executor;)V PLcom/google/firebase/components/EventBus;->subscribe(Ljava/lang/Class;Ljava/util/concurrent/Executor;Lcom/google/firebase/events/EventHandler;)V PLcom/google/firebase/components/Lazy;->()V PLcom/google/firebase/components/Lazy;->(Lcom/google/firebase/inject/Provider;)V PLcom/google/firebase/components/Lazy;->get()Ljava/lang/Object; PLcom/google/firebase/components/RestrictedComponentContainer;->(Lcom/google/firebase/components/Component;Lcom/google/firebase/components/ComponentContainer;)V PLcom/google/firebase/components/RestrictedComponentContainer;->get(Ljava/lang/Class;)Ljava/lang/Object; PLcom/google/firebase/components/RestrictedComponentContainer;->setOf(Ljava/lang/Class;)Ljava/util/Set; PLcom/google/firebase/crashlytics/CrashlyticsRegistrar;->()V PLcom/google/firebase/crashlytics/CrashlyticsRegistrar;->getComponents()Ljava/util/List; PLcom/google/firebase/crashlytics/FirebaseCrashlytics$1;->(Lcom/google/firebase/crashlytics/internal/Onboarding;Ljava/util/concurrent/ExecutorService;Lcom/google/firebase/crashlytics/internal/settings/SettingsController;ZLcom/google/firebase/crashlytics/internal/common/CrashlyticsCore;)V PLcom/google/firebase/crashlytics/FirebaseCrashlytics$1;->call()Ljava/lang/Object; PLcom/google/firebase/crashlytics/FirebaseCrashlytics;->(Lcom/google/firebase/crashlytics/internal/common/CrashlyticsCore;)V PLcom/google/firebase/crashlytics/internal/MissingNativeComponent;->()V PLcom/google/firebase/crashlytics/internal/MissingNativeComponent;->()V PLcom/google/firebase/crashlytics/internal/Onboarding;->(Lcom/google/firebase/FirebaseApp;Landroid/content/Context;Lcom/google/firebase/crashlytics/internal/common/IdManager;Lcom/google/firebase/crashlytics/internal/common/DataCollectionArbiter;)V PLcom/google/firebase/crashlytics/internal/Onboarding;->getOverridenSpiEndpoint()Ljava/lang/String; PLcom/google/firebase/crashlytics/internal/analytics/BlockingAnalyticsEventLogger;->(Lio/grpc/Attributes$Key;ILjava/util/concurrent/TimeUnit;)V PLcom/google/firebase/crashlytics/internal/common/AbstractSpiCall;->()V PLcom/google/firebase/crashlytics/internal/common/AbstractSpiCall;->(Ljava/lang/String;Ljava/lang/String;Lcom/google/android/gms/stats/zza;I)V PLcom/google/firebase/crashlytics/internal/common/BackgroundPriorityRunnable;->()V PLcom/google/firebase/crashlytics/internal/common/BackgroundPriorityRunnable;->run()V PLcom/google/firebase/crashlytics/internal/common/CLSUUID;->()V PLcom/google/firebase/crashlytics/internal/common/CLSUUID;->(Lcom/google/firebase/crashlytics/internal/common/IdManager;)V PLcom/google/firebase/crashlytics/internal/common/CLSUUID;->convertLongToTwoByteBuffer(J)[B PLcom/google/firebase/crashlytics/internal/common/CommonUtils$Architecture;->()V PLcom/google/firebase/crashlytics/internal/common/CommonUtils$Architecture;->(Ljava/lang/String;I)V PLcom/google/firebase/crashlytics/internal/common/CrashlyticsBackgroundWorker;->(Ljava/util/concurrent/ExecutorService;)V PLcom/google/firebase/crashlytics/internal/common/CrashlyticsBackgroundWorker;->checkRunningOnThread()V PLcom/google/firebase/crashlytics/internal/common/CrashlyticsBackgroundWorker;->submit(Ljava/lang/Runnable;)Lcom/google/android/gms/tasks/Task; PLcom/google/firebase/crashlytics/internal/common/CrashlyticsBackgroundWorker;->submit(Ljava/util/concurrent/Callable;)Lcom/google/android/gms/tasks/Task; PLcom/google/firebase/crashlytics/internal/common/CrashlyticsController$10;->(Lcom/google/firebase/crashlytics/internal/common/CrashlyticsController;JLjava/lang/String;)V PLcom/google/firebase/crashlytics/internal/common/CrashlyticsController$10;->call()Ljava/lang/Object; PLcom/google/firebase/crashlytics/internal/common/CrashlyticsController$19;->(Lcom/google/firebase/crashlytics/internal/common/CrashlyticsController;Ljava/lang/String;Ljava/lang/String;Z)V PLcom/google/firebase/crashlytics/internal/common/CrashlyticsController$19;->writeTo(Lcom/google/firebase/crashlytics/internal/proto/CodedOutputStream;)V PLcom/google/firebase/crashlytics/internal/common/CrashlyticsController$1;->(Ljava/lang/String;)V PLcom/google/firebase/crashlytics/internal/common/CrashlyticsController$1;->accept(Ljava/io/File;Ljava/lang/String;)Z PLcom/google/firebase/crashlytics/internal/common/CrashlyticsController$20;->(Lcom/google/firebase/crashlytics/internal/common/CrashlyticsController;ILjava/lang/String;IJJZILjava/lang/String;Ljava/lang/String;)V PLcom/google/firebase/crashlytics/internal/common/CrashlyticsController$20;->writeTo(Lcom/google/firebase/crashlytics/internal/proto/CodedOutputStream;)V PLcom/google/firebase/crashlytics/internal/common/CrashlyticsController$7;->(Lcom/google/firebase/crashlytics/internal/common/CrashlyticsController;)V PLcom/google/firebase/crashlytics/internal/common/CrashlyticsController$7;->(Lcom/google/firebase/crashlytics/internal/common/CrashlyticsController;Lcom/google/firebase/crashlytics/internal/common/CrashlyticsController$1;)V PLcom/google/firebase/crashlytics/internal/common/CrashlyticsController;->()V PLcom/google/firebase/crashlytics/internal/common/CrashlyticsController;->(Landroid/content/Context;Lcom/google/firebase/crashlytics/internal/common/CrashlyticsBackgroundWorker;Lcom/google/android/gms/stats/zza;Lcom/google/firebase/crashlytics/internal/common/IdManager;Lcom/google/firebase/crashlytics/internal/common/DataCollectionArbiter;Lcom/bumptech/glide/module/ManifestParser;Landroidx/lifecycle/ViewModelProvider;Landroidx/databinding/ViewStubProxy;Lcom/google/firebase/iid/zzz;Lcom/google/firebase/crashlytics/internal/common/CrashlyticsController$7;Lcom/google/firebase/crashlytics/internal/CrashlyticsNativeComponent;Lcom/google/android/gms/tasks/zzr;Lcom/google/firebase/crashlytics/internal/analytics/AnalyticsEventLogger;Lcom/google/firebase/crashlytics/internal/settings/SettingsDataProvider;)V PLcom/google/firebase/crashlytics/internal/common/CrashlyticsController;->access$1000(Lcom/google/firebase/crashlytics/internal/common/CrashlyticsController;)V PLcom/google/firebase/crashlytics/internal/common/CrashlyticsController;->doCloseSessions(IZ)V PLcom/google/firebase/crashlytics/internal/common/CrashlyticsController;->finalizeSessions(I)Z PLcom/google/firebase/crashlytics/internal/common/CrashlyticsController;->getCurrentSessionId()Ljava/lang/String; PLcom/google/firebase/crashlytics/internal/common/CrashlyticsController;->getCurrentTimestampSeconds()J PLcom/google/firebase/crashlytics/internal/common/CrashlyticsController;->getFatalSessionFilesDir()Ljava/io/File; PLcom/google/firebase/crashlytics/internal/common/CrashlyticsController;->getFilesDir()Ljava/io/File; PLcom/google/firebase/crashlytics/internal/common/CrashlyticsController;->getNativeSessionFilesDir()Ljava/io/File; PLcom/google/firebase/crashlytics/internal/common/CrashlyticsController;->getNonFatalSessionFilesDir()Ljava/io/File; PLcom/google/firebase/crashlytics/internal/common/CrashlyticsController;->getSessionIdFromSessionFile(Ljava/io/File;)Ljava/lang/String; PLcom/google/firebase/crashlytics/internal/common/CrashlyticsController;->isHandlingException()Z PLcom/google/firebase/crashlytics/internal/common/CrashlyticsController;->listCompleteSessionFiles()[Ljava/io/File; PLcom/google/firebase/crashlytics/internal/common/CrashlyticsController;->listFilesMatching(Ljava/io/File;Ljava/io/FilenameFilter;)[Ljava/io/File; PLcom/google/firebase/crashlytics/internal/common/CrashlyticsController;->listSortedSessionBeginFiles()[Ljava/io/File; PLcom/google/firebase/crashlytics/internal/common/CrashlyticsController;->makeFirebaseSessionIdentifier(Ljava/lang/String;)Ljava/lang/String; PLcom/google/firebase/crashlytics/internal/common/CrashlyticsController;->submitAllReports(FLcom/google/android/gms/tasks/Task;)Lcom/google/android/gms/tasks/Task; PLcom/google/firebase/crashlytics/internal/common/CrashlyticsController;->writeSessionPartFile(Ljava/lang/String;Ljava/lang/String;Lcom/google/firebase/crashlytics/internal/common/CrashlyticsController$CodedOutputStreamWriteAction;)V PLcom/google/firebase/crashlytics/internal/common/CrashlyticsCore$3;->(Lcom/google/firebase/crashlytics/internal/common/CrashlyticsCore;I)V PLcom/google/firebase/crashlytics/internal/common/CrashlyticsCore$3;->call()Ljava/lang/Boolean; PLcom/google/firebase/crashlytics/internal/common/CrashlyticsCore$3;->call()Ljava/lang/Object; PLcom/google/firebase/crashlytics/internal/common/CrashlyticsCore;->(Lcom/google/firebase/FirebaseApp;Lcom/google/firebase/crashlytics/internal/common/IdManager;Lcom/google/firebase/crashlytics/internal/CrashlyticsNativeComponent;Lcom/google/firebase/crashlytics/internal/common/DataCollectionArbiter;Lcom/google/firebase/crashlytics/internal/breadcrumbs/BreadcrumbSource;Lcom/google/firebase/crashlytics/internal/analytics/AnalyticsEventLogger;Ljava/util/concurrent/ExecutorService;)V PLcom/google/firebase/crashlytics/internal/common/CrashlyticsCore;->access$000(Lcom/google/firebase/crashlytics/internal/common/CrashlyticsCore;Lcom/google/firebase/crashlytics/internal/settings/SettingsDataProvider;)Lcom/google/android/gms/tasks/Task; PLcom/google/firebase/crashlytics/internal/common/CrashlyticsCore;->markInitializationComplete()V PLcom/google/firebase/crashlytics/internal/common/CrashlyticsReportDataCapture;->()V PLcom/google/firebase/crashlytics/internal/common/CrashlyticsReportDataCapture;->(Landroid/content/Context;Lcom/google/firebase/crashlytics/internal/common/IdManager;Landroidx/databinding/ViewStubProxy;Lcom/google/firebase/crashlytics/internal/stacktrace/StackTraceTrimmingStrategy;)V PLcom/google/firebase/crashlytics/internal/common/CrashlyticsUncaughtExceptionHandler;->(Lio/grpc/Attributes$Key;Lcom/google/firebase/crashlytics/internal/settings/SettingsDataProvider;Ljava/lang/Thread$UncaughtExceptionHandler;)V PLcom/google/firebase/crashlytics/internal/common/DataCollectionArbiter;->(Lcom/google/firebase/FirebaseApp;)V PLcom/google/firebase/crashlytics/internal/common/DataCollectionArbiter;->isAutomaticDataCollectionEnabled()Z PLcom/google/firebase/crashlytics/internal/common/DataCollectionArbiter;->logDataCollectionState(Z)V PLcom/google/firebase/crashlytics/internal/common/DataCollectionArbiter;->waitForDataCollectionPermission()Lcom/google/android/gms/tasks/Task; PLcom/google/firebase/crashlytics/internal/common/ExecutorUtils$1$1;->(Landroidx/arch/core/executor/DefaultTaskExecutor$1;Ljava/lang/Runnable;)V PLcom/google/firebase/crashlytics/internal/common/ExecutorUtils$1$1;->onRun()V PLcom/google/firebase/crashlytics/internal/common/ExecutorUtils$2;->(Ljava/lang/String;Ljava/util/concurrent/ExecutorService;JLjava/util/concurrent/TimeUnit;)V PLcom/google/firebase/crashlytics/internal/common/IdManager;->()V PLcom/google/firebase/crashlytics/internal/common/IdManager;->(Landroid/content/Context;Ljava/lang/String;Lcom/google/firebase/installations/FirebaseInstallationsApi;)V PLcom/google/firebase/crashlytics/internal/common/IdManager;->getCrashlyticsInstallId()Ljava/lang/String; PLcom/google/firebase/crashlytics/internal/common/IdManager;->getInstallerPackageName()Ljava/lang/String; PLcom/google/firebase/crashlytics/internal/common/IdManager;->removeForwardSlashesIn(Ljava/lang/String;)Ljava/lang/String; PLcom/google/firebase/crashlytics/internal/common/MetaDataStore;->()V PLcom/google/firebase/crashlytics/internal/common/MetaDataStore;->(Ljava/io/File;)V PLcom/google/firebase/crashlytics/internal/common/MetaDataStore;->getUserDataFileForSession(Ljava/lang/String;)Ljava/io/File; PLcom/google/firebase/crashlytics/internal/common/Utils$1;->(I)V PLcom/google/firebase/crashlytics/internal/common/Utils$1;->(Lcom/google/firebase/crashlytics/internal/common/CrashlyticsController$1;)V PLcom/google/firebase/crashlytics/internal/common/Utils$1;->accept(Ljava/io/File;Ljava/lang/String;)Z PLcom/google/firebase/crashlytics/internal/common/Utils;->()V PLcom/google/firebase/crashlytics/internal/common/Utils;->awaitEvenIfOnMainThread(Lcom/google/android/gms/tasks/Task;)Ljava/lang/Object; PLcom/google/firebase/crashlytics/internal/log/LogFileManager;->()V PLcom/google/firebase/crashlytics/internal/log/LogFileManager;->(Landroid/content/Context;Lio/grpc/Attributes$Key;)V PLcom/google/firebase/crashlytics/internal/log/LogFileManager;->setCurrentSession(Ljava/lang/String;)V PLcom/google/firebase/crashlytics/internal/log/QueueFile$Element;->()V PLcom/google/firebase/crashlytics/internal/log/QueueFile$Element;->(II)V PLcom/google/firebase/crashlytics/internal/log/QueueFile;->()V PLcom/google/firebase/crashlytics/internal/log/QueueFile;->(Ljava/io/File;)V PLcom/google/firebase/crashlytics/internal/log/QueueFile;->add([B)V PLcom/google/firebase/crashlytics/internal/log/QueueFile;->expandIfNecessary(I)V PLcom/google/firebase/crashlytics/internal/log/QueueFile;->isEmpty()Z PLcom/google/firebase/crashlytics/internal/log/QueueFile;->readElement(I)Lcom/google/firebase/crashlytics/internal/log/QueueFile$Element; PLcom/google/firebase/crashlytics/internal/log/QueueFile;->readInt([BI)I PLcom/google/firebase/crashlytics/internal/log/QueueFile;->ringWrite(I[BII)V PLcom/google/firebase/crashlytics/internal/log/QueueFile;->usedBytes()I PLcom/google/firebase/crashlytics/internal/log/QueueFile;->wrapPosition(I)I PLcom/google/firebase/crashlytics/internal/log/QueueFile;->writeHeader(IIII)V PLcom/google/firebase/crashlytics/internal/log/QueueFile;->writeInt([BII)V PLcom/google/firebase/crashlytics/internal/log/QueueFileLogStore;->()V PLcom/google/firebase/crashlytics/internal/log/QueueFileLogStore;->(Ljava/io/File;I)V PLcom/google/firebase/crashlytics/internal/log/QueueFileLogStore;->openLogFile()V PLcom/google/firebase/crashlytics/internal/log/QueueFileLogStore;->writeToLog(JLjava/lang/String;)V PLcom/google/firebase/crashlytics/internal/model/AutoCrashlyticsReportEncoder$CrashlyticsReportCustomAttributeEncoder;->()V PLcom/google/firebase/crashlytics/internal/model/AutoCrashlyticsReportEncoder$CrashlyticsReportCustomAttributeEncoder;->()V PLcom/google/firebase/crashlytics/internal/model/AutoCrashlyticsReportEncoder$CrashlyticsReportEncoder;->()V PLcom/google/firebase/crashlytics/internal/model/AutoCrashlyticsReportEncoder$CrashlyticsReportEncoder;->()V PLcom/google/firebase/crashlytics/internal/model/AutoCrashlyticsReportEncoder$CrashlyticsReportEncoder;->encode(Ljava/lang/Object;Ljava/lang/Object;)V PLcom/google/firebase/crashlytics/internal/model/AutoCrashlyticsReportEncoder$CrashlyticsReportFilesPayloadEncoder;->()V PLcom/google/firebase/crashlytics/internal/model/AutoCrashlyticsReportEncoder$CrashlyticsReportFilesPayloadEncoder;->()V PLcom/google/firebase/crashlytics/internal/model/AutoCrashlyticsReportEncoder$CrashlyticsReportFilesPayloadFileEncoder;->()V PLcom/google/firebase/crashlytics/internal/model/AutoCrashlyticsReportEncoder$CrashlyticsReportFilesPayloadFileEncoder;->()V PLcom/google/firebase/crashlytics/internal/model/AutoCrashlyticsReportEncoder$CrashlyticsReportSessionApplicationEncoder;->()V PLcom/google/firebase/crashlytics/internal/model/AutoCrashlyticsReportEncoder$CrashlyticsReportSessionApplicationEncoder;->()V PLcom/google/firebase/crashlytics/internal/model/AutoCrashlyticsReportEncoder$CrashlyticsReportSessionApplicationEncoder;->encode(Ljava/lang/Object;Ljava/lang/Object;)V PLcom/google/firebase/crashlytics/internal/model/AutoCrashlyticsReportEncoder$CrashlyticsReportSessionApplicationOrganizationEncoder;->()V PLcom/google/firebase/crashlytics/internal/model/AutoCrashlyticsReportEncoder$CrashlyticsReportSessionApplicationOrganizationEncoder;->()V PLcom/google/firebase/crashlytics/internal/model/AutoCrashlyticsReportEncoder$CrashlyticsReportSessionDeviceEncoder;->()V PLcom/google/firebase/crashlytics/internal/model/AutoCrashlyticsReportEncoder$CrashlyticsReportSessionDeviceEncoder;->()V PLcom/google/firebase/crashlytics/internal/model/AutoCrashlyticsReportEncoder$CrashlyticsReportSessionDeviceEncoder;->encode(Ljava/lang/Object;Ljava/lang/Object;)V PLcom/google/firebase/crashlytics/internal/model/AutoCrashlyticsReportEncoder$CrashlyticsReportSessionEncoder;->()V PLcom/google/firebase/crashlytics/internal/model/AutoCrashlyticsReportEncoder$CrashlyticsReportSessionEncoder;->()V PLcom/google/firebase/crashlytics/internal/model/AutoCrashlyticsReportEncoder$CrashlyticsReportSessionEncoder;->encode(Ljava/lang/Object;Ljava/lang/Object;)V PLcom/google/firebase/crashlytics/internal/model/AutoCrashlyticsReportEncoder$CrashlyticsReportSessionEventApplicationEncoder;->()V PLcom/google/firebase/crashlytics/internal/model/AutoCrashlyticsReportEncoder$CrashlyticsReportSessionEventApplicationEncoder;->()V PLcom/google/firebase/crashlytics/internal/model/AutoCrashlyticsReportEncoder$CrashlyticsReportSessionEventApplicationExecutionBinaryImageEncoder;->()V PLcom/google/firebase/crashlytics/internal/model/AutoCrashlyticsReportEncoder$CrashlyticsReportSessionEventApplicationExecutionBinaryImageEncoder;->()V PLcom/google/firebase/crashlytics/internal/model/AutoCrashlyticsReportEncoder$CrashlyticsReportSessionEventApplicationExecutionEncoder;->()V PLcom/google/firebase/crashlytics/internal/model/AutoCrashlyticsReportEncoder$CrashlyticsReportSessionEventApplicationExecutionEncoder;->()V PLcom/google/firebase/crashlytics/internal/model/AutoCrashlyticsReportEncoder$CrashlyticsReportSessionEventApplicationExecutionExceptionEncoder;->()V PLcom/google/firebase/crashlytics/internal/model/AutoCrashlyticsReportEncoder$CrashlyticsReportSessionEventApplicationExecutionExceptionEncoder;->()V PLcom/google/firebase/crashlytics/internal/model/AutoCrashlyticsReportEncoder$CrashlyticsReportSessionEventApplicationExecutionSignalEncoder;->()V PLcom/google/firebase/crashlytics/internal/model/AutoCrashlyticsReportEncoder$CrashlyticsReportSessionEventApplicationExecutionSignalEncoder;->()V PLcom/google/firebase/crashlytics/internal/model/AutoCrashlyticsReportEncoder$CrashlyticsReportSessionEventApplicationExecutionThreadEncoder;->()V PLcom/google/firebase/crashlytics/internal/model/AutoCrashlyticsReportEncoder$CrashlyticsReportSessionEventApplicationExecutionThreadEncoder;->()V PLcom/google/firebase/crashlytics/internal/model/AutoCrashlyticsReportEncoder$CrashlyticsReportSessionEventApplicationExecutionThreadFrameEncoder;->()V PLcom/google/firebase/crashlytics/internal/model/AutoCrashlyticsReportEncoder$CrashlyticsReportSessionEventApplicationExecutionThreadFrameEncoder;->()V PLcom/google/firebase/crashlytics/internal/model/AutoCrashlyticsReportEncoder$CrashlyticsReportSessionEventDeviceEncoder;->()V PLcom/google/firebase/crashlytics/internal/model/AutoCrashlyticsReportEncoder$CrashlyticsReportSessionEventDeviceEncoder;->()V PLcom/google/firebase/crashlytics/internal/model/AutoCrashlyticsReportEncoder$CrashlyticsReportSessionEventEncoder;->()V PLcom/google/firebase/crashlytics/internal/model/AutoCrashlyticsReportEncoder$CrashlyticsReportSessionEventEncoder;->()V PLcom/google/firebase/crashlytics/internal/model/AutoCrashlyticsReportEncoder$CrashlyticsReportSessionEventLogEncoder;->()V PLcom/google/firebase/crashlytics/internal/model/AutoCrashlyticsReportEncoder$CrashlyticsReportSessionEventLogEncoder;->()V PLcom/google/firebase/crashlytics/internal/model/AutoCrashlyticsReportEncoder$CrashlyticsReportSessionOperatingSystemEncoder;->()V PLcom/google/firebase/crashlytics/internal/model/AutoCrashlyticsReportEncoder$CrashlyticsReportSessionOperatingSystemEncoder;->()V PLcom/google/firebase/crashlytics/internal/model/AutoCrashlyticsReportEncoder$CrashlyticsReportSessionOperatingSystemEncoder;->encode(Ljava/lang/Object;Ljava/lang/Object;)V PLcom/google/firebase/crashlytics/internal/model/AutoCrashlyticsReportEncoder$CrashlyticsReportSessionUserEncoder;->()V PLcom/google/firebase/crashlytics/internal/model/AutoCrashlyticsReportEncoder$CrashlyticsReportSessionUserEncoder;->()V PLcom/google/firebase/crashlytics/internal/model/AutoValue_CrashlyticsReport$Builder;->()V PLcom/google/firebase/crashlytics/internal/model/AutoValue_CrashlyticsReport$Builder;->build()Lcom/google/firebase/crashlytics/internal/model/CrashlyticsReport; PLcom/google/firebase/crashlytics/internal/model/AutoValue_CrashlyticsReport;->(Ljava/lang/String;Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;Lcom/google/firebase/crashlytics/internal/model/CrashlyticsReport$Session;Lcom/google/firebase/crashlytics/internal/model/CrashlyticsReport$FilesPayload;Lokhttp3/RequestBody;)V PLcom/google/firebase/crashlytics/internal/model/AutoValue_CrashlyticsReport_Session$Builder;->()V PLcom/google/firebase/crashlytics/internal/model/AutoValue_CrashlyticsReport_Session$Builder;->build()Lcom/google/firebase/crashlytics/internal/model/CrashlyticsReport$Session; PLcom/google/firebase/crashlytics/internal/model/AutoValue_CrashlyticsReport_Session$Builder;->setCrashed(Z)Lcom/google/firebase/crashlytics/internal/model/AutoValue_CrashlyticsReport_Session$Builder; PLcom/google/firebase/crashlytics/internal/model/AutoValue_CrashlyticsReport_Session;->(Ljava/lang/String;Ljava/lang/String;JLjava/lang/Long;ZLcom/google/firebase/crashlytics/internal/model/CrashlyticsReport$Session$Application;Lcom/google/firebase/crashlytics/internal/model/CrashlyticsReport$Session$User;Lcom/google/firebase/crashlytics/internal/model/CrashlyticsReport$Session$OperatingSystem;Lcom/google/firebase/crashlytics/internal/model/CrashlyticsReport$Session$Device;Lcom/google/firebase/crashlytics/internal/model/ImmutableList;ILkotlin/ResultKt;)V PLcom/google/firebase/crashlytics/internal/model/AutoValue_CrashlyticsReport_Session_Application;->(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lcom/google/firebase/iid/zzh;Ljava/lang/String;Lokhttp3/RequestBody;)V PLcom/google/firebase/crashlytics/internal/model/AutoValue_CrashlyticsReport_Session_Device$Builder;->()V PLcom/google/firebase/crashlytics/internal/model/AutoValue_CrashlyticsReport_Session_Device$Builder;->build()Lcom/google/firebase/crashlytics/internal/model/CrashlyticsReport$Session$Device; PLcom/google/firebase/crashlytics/internal/model/AutoValue_CrashlyticsReport_Session_Device;->(ILjava/lang/String;IJJZILjava/lang/String;Ljava/lang/String;Landroidx/core/R$dimen;)V PLcom/google/firebase/crashlytics/internal/model/AutoValue_CrashlyticsReport_Session_OperatingSystem$Builder;->(I)V PLcom/google/firebase/crashlytics/internal/model/AutoValue_CrashlyticsReport_Session_OperatingSystem$Builder;->build()Lcom/google/firebase/crashlytics/internal/model/CrashlyticsReport$Session$OperatingSystem; PLcom/google/firebase/crashlytics/internal/model/AutoValue_CrashlyticsReport_Session_OperatingSystem;->(ILjava/lang/String;Ljava/lang/String;ZLcom/google/common/collect/Maps;)V PLcom/google/firebase/crashlytics/internal/model/CrashlyticsReport$Session$Application;->()V PLcom/google/firebase/crashlytics/internal/model/CrashlyticsReport$Session$Device;->()V PLcom/google/firebase/crashlytics/internal/model/CrashlyticsReport$Session$OperatingSystem;->()V PLcom/google/firebase/crashlytics/internal/model/CrashlyticsReport$Session;->()V PLcom/google/firebase/crashlytics/internal/model/CrashlyticsReport;->()V PLcom/google/firebase/crashlytics/internal/model/CrashlyticsReport;->()V PLcom/google/firebase/crashlytics/internal/model/serialization/CrashlyticsReportJsonTransform;->()V PLcom/google/firebase/crashlytics/internal/model/serialization/CrashlyticsReportJsonTransform;->()V PLcom/google/firebase/crashlytics/internal/model/serialization/CrashlyticsReportJsonTransform;->reportToJson(Lcom/google/firebase/crashlytics/internal/model/CrashlyticsReport;)Ljava/lang/String; PLcom/google/firebase/crashlytics/internal/persistence/CrashlyticsReportPersistence$$Lambda$2;->(Ljava/lang/String;)V PLcom/google/firebase/crashlytics/internal/persistence/CrashlyticsReportPersistence$$Lambda$2;->accept(Ljava/io/File;)Z PLcom/google/firebase/crashlytics/internal/persistence/CrashlyticsReportPersistence$$Lambda$5;->()V PLcom/google/firebase/crashlytics/internal/persistence/CrashlyticsReportPersistence$$Lambda$5;->()V PLcom/google/firebase/crashlytics/internal/persistence/CrashlyticsReportPersistence$$Lambda$6;->()V PLcom/google/firebase/crashlytics/internal/persistence/CrashlyticsReportPersistence$$Lambda$6;->()V PLcom/google/firebase/crashlytics/internal/persistence/CrashlyticsReportPersistence$$Lambda$6;->accept(Ljava/io/File;Ljava/lang/String;)Z PLcom/google/firebase/crashlytics/internal/persistence/CrashlyticsReportPersistence;->()V PLcom/google/firebase/crashlytics/internal/persistence/CrashlyticsReportPersistence;->(Ljava/io/File;Lcom/google/firebase/crashlytics/internal/settings/SettingsDataProvider;)V PLcom/google/firebase/crashlytics/internal/persistence/CrashlyticsReportPersistence;->combineReportFiles([Ljava/util/List;)Ljava/util/List; PLcom/google/firebase/crashlytics/internal/persistence/CrashlyticsReportPersistence;->getAllFilesInDirectory(Ljava/io/File;)Ljava/util/List; PLcom/google/firebase/crashlytics/internal/persistence/CrashlyticsReportPersistence;->getAllFinalizedReportFiles()Ljava/util/List; PLcom/google/firebase/crashlytics/internal/persistence/CrashlyticsReportPersistence;->getFilesInDirectory(Ljava/io/File;Ljava/io/FileFilter;)Ljava/util/List; PLcom/google/firebase/crashlytics/internal/persistence/CrashlyticsReportPersistence;->getFilesInDirectory(Ljava/io/File;Ljava/io/FilenameFilter;)Ljava/util/List; PLcom/google/firebase/crashlytics/internal/persistence/CrashlyticsReportPersistence;->getSessionDirectoryById(Ljava/lang/String;)Ljava/io/File; PLcom/google/firebase/crashlytics/internal/persistence/CrashlyticsReportPersistence;->prepareDirectory(Ljava/io/File;)Ljava/io/File; PLcom/google/firebase/crashlytics/internal/persistence/CrashlyticsReportPersistence;->recursiveDelete(Ljava/io/File;)V PLcom/google/firebase/crashlytics/internal/persistence/CrashlyticsReportPersistence;->writeTextFile(Ljava/io/File;Ljava/lang/String;)V PLcom/google/firebase/crashlytics/internal/proto/ByteString;->([B)V PLcom/google/firebase/crashlytics/internal/proto/ByteString;->copyFromUtf8(Ljava/lang/String;)Lcom/google/firebase/crashlytics/internal/proto/ByteString; PLcom/google/firebase/crashlytics/internal/proto/ClsFileOutputStream;->()V PLcom/google/firebase/crashlytics/internal/proto/ClsFileOutputStream;->(Ljava/io/File;Ljava/lang/String;)V PLcom/google/firebase/crashlytics/internal/proto/ClsFileOutputStream;->close()V PLcom/google/firebase/crashlytics/internal/proto/CodedOutputStream;->(Ljava/io/OutputStream;[B)V PLcom/google/firebase/crashlytics/internal/proto/CodedOutputStream;->computeBoolSize(IZ)I PLcom/google/firebase/crashlytics/internal/proto/CodedOutputStream;->computeBytesSize(ILcom/google/firebase/crashlytics/internal/proto/ByteString;)I PLcom/google/firebase/crashlytics/internal/proto/CodedOutputStream;->computeEnumSize(II)I PLcom/google/firebase/crashlytics/internal/proto/CodedOutputStream;->computeRawVarint32Size(I)I PLcom/google/firebase/crashlytics/internal/proto/CodedOutputStream;->computeTagSize(I)I PLcom/google/firebase/crashlytics/internal/proto/CodedOutputStream;->computeUInt32Size(II)I PLcom/google/firebase/crashlytics/internal/proto/CodedOutputStream;->computeUInt64Size(IJ)I PLcom/google/firebase/crashlytics/internal/proto/CodedOutputStream;->flush()V PLcom/google/firebase/crashlytics/internal/proto/CodedOutputStream;->newInstance(Ljava/io/OutputStream;)Lcom/google/firebase/crashlytics/internal/proto/CodedOutputStream; PLcom/google/firebase/crashlytics/internal/proto/CodedOutputStream;->refreshBuffer()V PLcom/google/firebase/crashlytics/internal/proto/CodedOutputStream;->writeBool(IZ)V PLcom/google/firebase/crashlytics/internal/proto/CodedOutputStream;->writeBytes(ILcom/google/firebase/crashlytics/internal/proto/ByteString;)V PLcom/google/firebase/crashlytics/internal/proto/CodedOutputStream;->writeEnum(II)V PLcom/google/firebase/crashlytics/internal/proto/CodedOutputStream;->writeRawByte(I)V PLcom/google/firebase/crashlytics/internal/proto/CodedOutputStream;->writeRawVarint32(I)V PLcom/google/firebase/crashlytics/internal/proto/CodedOutputStream;->writeRawVarint64(J)V PLcom/google/firebase/crashlytics/internal/proto/CodedOutputStream;->writeTag(II)V PLcom/google/firebase/crashlytics/internal/proto/CodedOutputStream;->writeUInt32(II)V PLcom/google/firebase/crashlytics/internal/proto/CodedOutputStream;->writeUInt64(IJ)V PLcom/google/firebase/crashlytics/internal/proto/SessionProtobufHelper;->()V PLcom/google/firebase/crashlytics/internal/proto/SessionProtobufHelper;->stringToByteString(Ljava/lang/String;)Lcom/google/firebase/crashlytics/internal/proto/ByteString; PLcom/google/firebase/crashlytics/internal/send/DataTransportCrashlyticsReportSender;->()V PLcom/google/firebase/crashlytics/internal/send/DataTransportCrashlyticsReportSender;->(Lcom/google/android/datatransport/Transport;Lcom/google/android/datatransport/Transformer;)V PLcom/google/firebase/crashlytics/internal/send/DataTransportCrashlyticsReportSender;->mergeStrings(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; PLcom/google/firebase/crashlytics/internal/settings/SettingsController;->(Landroid/content/Context;Lcom/google/firebase/crashlytics/internal/settings/model/SettingsRequest;Lcom/google/android/gms/stats/zza;Lcom/google/firebase/iid/zzz;Landroidx/appcompat/view/ActionBarPolicy;Lcom/google/firebase/crashlytics/internal/settings/network/SettingsSpiCall;Lcom/google/firebase/crashlytics/internal/common/DataCollectionArbiter;)V PLcom/google/firebase/crashlytics/internal/settings/SettingsController;->getAppSettings()Lcom/google/android/gms/tasks/Task; PLcom/google/firebase/crashlytics/internal/settings/SettingsController;->getCachedSettingsData$enumunboxing$(I)Lcom/google/firebase/crashlytics/internal/settings/model/SettingsData; PLcom/google/firebase/crashlytics/internal/settings/SettingsController;->getSettings()Lcom/google/firebase/crashlytics/internal/settings/model/SettingsData; PLcom/google/firebase/crashlytics/internal/settings/SettingsController;->loadSettingsData$enumunboxing$(ILjava/util/concurrent/Executor;)Lcom/google/android/gms/tasks/Task; PLcom/google/firebase/crashlytics/internal/settings/model/SettingsData;->(JLcom/google/firebase/crashlytics/internal/settings/model/AppSettingsData;Landroidx/compose/material/FabPlacement;Lcom/google/firebase/auth/internal/zzaf;II)V PLcom/google/firebase/crashlytics/internal/settings/model/SettingsRequest;->(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lcom/google/firebase/crashlytics/internal/common/InstallIdProvider;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;I)V PLcom/google/firebase/crashlytics/internal/settings/network/DefaultSettingsSpiCall;->(Ljava/lang/String;Ljava/lang/String;Lcom/google/android/gms/stats/zza;)V PLcom/google/firebase/datatransport/TransportRegistrar;->()V PLcom/google/firebase/datatransport/TransportRegistrar;->getComponents()Ljava/util/List; PLcom/google/firebase/datatransport/TransportRegistrar;->lambda$getComponents$0(Lcom/google/firebase/components/ComponentContainer;)Lcom/google/android/datatransport/TransportFactory; PLcom/google/firebase/encoders/json/JsonDataEncoderBuilder$$Lambda$1;->()V PLcom/google/firebase/encoders/json/JsonDataEncoderBuilder$$Lambda$1;->()V PLcom/google/firebase/encoders/json/JsonDataEncoderBuilder$$Lambda$4;->()V PLcom/google/firebase/encoders/json/JsonDataEncoderBuilder$$Lambda$4;->()V PLcom/google/firebase/encoders/json/JsonDataEncoderBuilder$$Lambda$4;->encode(Ljava/lang/Object;Ljava/lang/Object;)V PLcom/google/firebase/encoders/json/JsonDataEncoderBuilder$$Lambda$5;->()V PLcom/google/firebase/encoders/json/JsonDataEncoderBuilder$$Lambda$5;->()V PLcom/google/firebase/encoders/json/JsonDataEncoderBuilder$TimestampEncoder;->()V PLcom/google/firebase/encoders/json/JsonDataEncoderBuilder$TimestampEncoder;->(Lcom/google/ar/core/ac;)V PLcom/google/firebase/encoders/json/JsonDataEncoderBuilder;->()V PLcom/google/firebase/encoders/json/JsonDataEncoderBuilder;->()V PLcom/google/firebase/encoders/json/JsonDataEncoderBuilder;->build()Lcom/google/ar/core/ac; PLcom/google/firebase/encoders/json/JsonValueObjectEncoderContext;->(Ljava/io/Writer;Ljava/util/Map;Ljava/util/Map;Lcom/google/firebase/encoders/ObjectEncoder;Z)V PLcom/google/firebase/encoders/json/JsonValueObjectEncoderContext;->add(Ljava/lang/Object;Z)Lcom/google/firebase/encoders/json/JsonValueObjectEncoderContext; PLcom/google/firebase/encoders/json/JsonValueObjectEncoderContext;->add(Ljava/lang/String;I)Lcom/google/firebase/encoders/ObjectEncoderContext; PLcom/google/firebase/encoders/json/JsonValueObjectEncoderContext;->add(Ljava/lang/String;Ljava/lang/Object;)Lcom/google/firebase/encoders/json/JsonValueObjectEncoderContext; PLcom/google/firebase/encoders/json/JsonValueObjectEncoderContext;->maybeUnNest()V PLcom/google/firebase/firestore/FirestoreRegistrar;->()V PLcom/google/firebase/firestore/FirestoreRegistrar;->getComponents()Ljava/util/List; PLcom/google/firebase/firestore/ktx/FirebaseFirestoreKtxRegistrar;->()V PLcom/google/firebase/firestore/ktx/FirebaseFirestoreKtxRegistrar;->getComponents()Ljava/util/List; PLcom/google/firebase/functions/FunctionsRegistrar;->()V PLcom/google/firebase/functions/FunctionsRegistrar;->getComponents()Ljava/util/List; PLcom/google/firebase/functions/ktx/FirebaseFunctionsKtxRegistrar;->()V PLcom/google/firebase/functions/ktx/FirebaseFunctionsKtxRegistrar;->getComponents()Ljava/util/List; PLcom/google/firebase/heartbeatinfo/DefaultHeartBeatInfo;->(Landroid/content/Context;)V PLcom/google/firebase/heartbeatinfo/DefaultHeartBeatInfo;->getHeartBeatCode$enumunboxing$(Ljava/lang/String;)I PLcom/google/firebase/heartbeatinfo/HeartBeatInfoStorage;->(Landroid/content/Context;)V PLcom/google/firebase/heartbeatinfo/HeartBeatInfoStorage;->shouldSendSdkHeartBeat(Ljava/lang/String;J)Z PLcom/google/firebase/iid/FirebaseInstanceId;->()V PLcom/google/firebase/iid/FirebaseInstanceId;->(Lcom/google/firebase/FirebaseApp;Lcom/google/firebase/events/Subscriber;Lcom/google/firebase/platforminfo/DefaultUserAgentPublisher;Lcom/google/firebase/heartbeatinfo/DefaultHeartBeatInfo;Lcom/google/firebase/installations/FirebaseInstallationsApi;)V PLcom/google/firebase/iid/FirebaseInstanceId;->getInstance()Lcom/google/firebase/iid/FirebaseInstanceId; PLcom/google/firebase/iid/FirebaseInstanceId;->getInstance(Lcom/google/firebase/FirebaseApp;)Lcom/google/firebase/iid/FirebaseInstanceId; PLcom/google/firebase/iid/FirebaseInstanceId;->zza(J)V PLcom/google/firebase/iid/FirebaseInstanceId;->zza(Lcom/google/firebase/iid/zzay;)Z PLcom/google/firebase/iid/FirebaseInstanceId;->zza(Ljava/lang/Runnable;J)V PLcom/google/firebase/iid/FirebaseInstanceId;->zza(Z)V PLcom/google/firebase/iid/FirebaseInstanceId;->zzb(Ljava/lang/String;Ljava/lang/String;)Lcom/google/firebase/iid/zzay; PLcom/google/firebase/iid/FirebaseInstanceId;->zzj()V PLcom/google/firebase/iid/FirebaseInstanceId;->zzk()V PLcom/google/firebase/iid/FirebaseInstanceId;->zzm()Ljava/lang/String; PLcom/google/firebase/iid/Registrar;->()V PLcom/google/firebase/iid/Registrar;->getComponents()Ljava/util/List; PLcom/google/firebase/iid/zzab;->(Lkotlinx/coroutines/flow/Flow;ILkotlinx/coroutines/channels/BufferOverflow;Lkotlin/coroutines/CoroutineContext;)V PLcom/google/firebase/iid/zzab;->endOptional()V PLcom/google/firebase/iid/zzao;->(Landroid/content/Context;)V PLcom/google/firebase/iid/zzao;->zza(Lcom/google/firebase/FirebaseApp;)Ljava/lang/String; PLcom/google/firebase/iid/zzao;->zzb()I PLcom/google/firebase/iid/zzaq;->()V PLcom/google/firebase/iid/zzaq;->()V PLcom/google/firebase/iid/zzaq;->create(Lcom/google/firebase/components/ComponentContainer;)Ljava/lang/Object; PLcom/google/firebase/iid/zzar;->()V PLcom/google/firebase/iid/zzar;->()V PLcom/google/firebase/iid/zzau;->(Landroid/content/Context;Lcom/google/firebase/iid/zzao;)V PLcom/google/firebase/iid/zzaw;->(Landroid/widget/ImageView;)V PLcom/google/firebase/iid/zzaw;->(Landroidx/compose/runtime/SnapshotThreadLocal;Ljava/lang/Class;Ljava/lang/reflect/Type;)V PLcom/google/firebase/iid/zzaw;->(Lcom/google/firebase/crashlytics/internal/Onboarding;Ljava/lang/String;Lcom/google/firebase/crashlytics/internal/settings/SettingsController;Ljava/util/concurrent/Executor;)V PLcom/google/firebase/iid/zzaw;->(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)V PLcom/google/firebase/iid/zzaw;->(Lkotlinx/coroutines/CoroutineScope;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;)V PLcom/google/firebase/iid/zzaw;->addFragment(Landroidx/fragment/app/Fragment;)V PLcom/google/firebase/iid/zzaw;->construct()Ljava/lang/Object; PLcom/google/firebase/iid/zzaw;->findActiveFragment(Ljava/lang/String;)Landroidx/fragment/app/Fragment; PLcom/google/firebase/iid/zzaw;->getActiveFragments()Ljava/util/List; PLcom/google/firebase/iid/zzaw;->getFragmentStateManager(Ljava/lang/String;)Landroidx/fragment/app/FragmentStateManager; PLcom/google/firebase/iid/zzaw;->makeActive(Landroidx/fragment/app/FragmentStateManager;)V PLcom/google/firebase/iid/zzaw;->makeInactive(Landroidx/fragment/app/FragmentStateManager;)V PLcom/google/firebase/iid/zzaw;->offer(Ljava/lang/Object;)V PLcom/google/firebase/iid/zzaw;->setSavedState(Ljava/lang/String;Landroidx/fragment/app/FragmentState;)Landroidx/fragment/app/FragmentState; PLcom/google/firebase/iid/zzaw;->zza()Lcom/google/firebase/iid/zzaw; PLcom/google/firebase/iid/zzaw;->zza(Landroid/content/Context;)Z PLcom/google/firebase/iid/zzax;->(Lcom/google/firebase/iid/zzau;Landroid/os/Looper;)V PLcom/google/firebase/iid/zzay;->()V PLcom/google/firebase/iid/zzay;->zza(Ljava/lang/String;)Lcom/google/firebase/iid/zzay; PLcom/google/firebase/iid/zzba;->(Ljava/lang/Object;I)V PLcom/google/firebase/iid/zzba;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V PLcom/google/firebase/iid/zzbb;->(Lcom/google/android/gms/measurement/internal/zzig;Lcom/google/android/gms/measurement/internal/zzih;J)V PLcom/google/firebase/iid/zzbb;->(Lcom/google/firebase/iid/FirebaseInstanceId;J)V PLcom/google/firebase/iid/zzbb;->run()V PLcom/google/firebase/iid/zzbb;->zza()Landroid/content/Context; PLcom/google/firebase/iid/zzc;->(Ljava/util/concurrent/Executor;)V PLcom/google/firebase/iid/zzf;->()V PLcom/google/firebase/iid/zzf;->()V PLcom/google/firebase/iid/zzf;->configure(Lcom/google/firebase/encoders/config/EncoderConfig;)V PLcom/google/firebase/iid/zzf;->create(Lcom/google/firebase/components/ComponentContainer;)Ljava/lang/Object; PLcom/google/firebase/iid/zzh;->()V PLcom/google/firebase/iid/zzh;->getMyProcessName()Ljava/lang/String; PLcom/google/firebase/iid/zzh;->writeProfile(Landroid/content/Context;Ljava/util/concurrent/Executor;Landroidx/profileinstaller/ProfileInstaller$DiagnosticsCallback;Z)V PLcom/google/firebase/iid/zzh;->zzb()Ljava/util/concurrent/ExecutorService; PLcom/google/firebase/iid/zzh;->zzk(Ljava/lang/String;)Ljava/io/BufferedReader; PLcom/google/firebase/iid/zzk;->(Landroid/content/Context;)V PLcom/google/firebase/iid/zzk;->(Landroid/content/Intent;)V PLcom/google/firebase/iid/zzk;->(Lcom/google/android/gms/measurement/AppMeasurement;Lio/grpc/CallOptions$Key;)V PLcom/google/firebase/iid/zzk;->(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;I)V PLcom/google/firebase/iid/zzk;->(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;ILandroidx/appcompat/R$id$$IA$1;)V PLcom/google/firebase/iid/zzk;->acquire()Ljava/lang/Object; PLcom/google/firebase/iid/zzk;->getBoolean(IZ)Z PLcom/google/firebase/iid/zzk;->getColorStateList(I)Landroid/content/res/ColorStateList; PLcom/google/firebase/iid/zzk;->getDimensionPixelOffset(II)I PLcom/google/firebase/iid/zzk;->getDrawable(I)Landroid/graphics/drawable/Drawable; PLcom/google/firebase/iid/zzk;->getDrawableIfKnown(I)Landroid/graphics/drawable/Drawable; PLcom/google/firebase/iid/zzk;->getHiltViewModelFactory(Landroidx/savedstate/SavedStateRegistryOwner;Landroid/os/Bundle;Landroidx/lifecycle/ViewModelProvider$Factory;)Landroidx/lifecycle/ViewModelProvider$Factory; PLcom/google/firebase/iid/zzk;->getInteger(II)I PLcom/google/firebase/iid/zzk;->getText(I)Ljava/lang/CharSequence; PLcom/google/firebase/iid/zzk;->obtainStyledAttributes(Landroid/content/Context;Landroid/util/AttributeSet;[I)Lcom/google/firebase/iid/zzk; PLcom/google/firebase/iid/zzk;->release(Ljava/lang/Object;)Z PLcom/google/firebase/iid/zzk;->zza(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; PLcom/google/firebase/iid/zzk;->zzb(Ljava/lang/String;)J PLcom/google/firebase/iid/zzk;->zzc(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; PLcom/google/firebase/iid/zzk;->zzd(Ljava/lang/String;)J PLcom/google/firebase/iid/zzn;->()V PLcom/google/firebase/iid/zzn;->()V PLcom/google/firebase/iid/zzn;->execute(Ljava/lang/Runnable;)V PLcom/google/firebase/iid/zzq;->(Lcom/google/android/gms/internal/clearcut/zzao;)V PLcom/google/firebase/iid/zzt;->(Lcom/google/firebase/FirebaseApp;Lcom/google/firebase/iid/zzao;Ljava/util/concurrent/Executor;Lcom/google/firebase/platforminfo/DefaultUserAgentPublisher;Lcom/google/firebase/heartbeatinfo/DefaultHeartBeatInfo;Lcom/google/firebase/installations/FirebaseInstallationsApi;)V PLcom/google/firebase/iid/zzv;->()V PLcom/google/firebase/iid/zzv;->()V PLcom/google/firebase/iid/zzv;->create(Lcom/google/firebase/components/ComponentContainer;)Ljava/lang/Object; PLcom/google/firebase/iid/zzy;->(Ljava/lang/Object;I)V PLcom/google/firebase/iid/zzy;->call()Ljava/lang/Object; PLcom/google/firebase/iid/zzy;->call()Ljava/lang/Void; PLcom/google/firebase/iid/zzz;->(ILandroidx/appcompat/R$id$$IA$1;)V PLcom/google/firebase/iid/zzz;->(Landroid/content/Context;)V PLcom/google/firebase/iid/zzz;->(Ljava/lang/Object;I)V PLcom/google/firebase/iid/zzz;->get()Ljava/lang/Object; PLcom/google/firebase/iid/zzz;->onApplyWindowInsets(Landroid/view/View;Landroidx/core/view/WindowInsetsCompat;Lcom/google/android/material/internal/ViewUtils$RelativePadding;)Landroidx/core/view/WindowInsetsCompat; PLcom/google/firebase/iid/zzz;->then(Lcom/google/android/gms/tasks/Task;)Ljava/lang/Object; PLcom/google/firebase/iid/zzz;->zza()Ljava/lang/String; PLcom/google/firebase/installations/FirebaseInstallations$$Lambda$2;->(Lcom/google/firebase/installations/FirebaseInstallations;ZI)V PLcom/google/firebase/installations/FirebaseInstallations;->()V PLcom/google/firebase/installations/FirebaseInstallations;->(Lcom/google/firebase/FirebaseApp;Lcom/google/firebase/platforminfo/DefaultUserAgentPublisher;Lcom/google/firebase/heartbeatinfo/DefaultHeartBeatInfo;)V PLcom/google/firebase/installations/FirebaseInstallations;->doRegistrationOrRefresh(Z)V PLcom/google/firebase/installations/FirebaseInstallations;->getApiKey()Ljava/lang/String; PLcom/google/firebase/installations/FirebaseInstallations;->getApplicationId()Ljava/lang/String; PLcom/google/firebase/installations/FirebaseInstallations;->getId()Lcom/google/android/gms/tasks/Task; PLcom/google/firebase/installations/FirebaseInstallations;->getProjectIdentifier()Ljava/lang/String; PLcom/google/firebase/installations/FirebaseInstallations;->triggerOnException(Lcom/google/firebase/installations/local/AutoValue_PersistedInstallationEntry;Ljava/lang/Exception;)V PLcom/google/firebase/installations/FirebaseInstallations;->triggerOnStateReached(Lcom/google/firebase/installations/local/AutoValue_PersistedInstallationEntry;)V PLcom/google/firebase/installations/FirebaseInstallationsException;->(I)V PLcom/google/firebase/installations/FirebaseInstallationsRegistrar;->()V PLcom/google/firebase/installations/FirebaseInstallationsRegistrar;->getComponents()Ljava/util/List; PLcom/google/firebase/installations/FirebaseInstallationsRegistrar;->lambda$getComponents$0(Lcom/google/firebase/components/ComponentContainer;)Lcom/google/firebase/installations/FirebaseInstallationsApi; PLcom/google/firebase/installations/GetIdListener;->(Lcom/google/android/gms/tasks/TaskCompletionSource;)V PLcom/google/firebase/installations/GetIdListener;->onException(Lcom/google/firebase/installations/local/AutoValue_PersistedInstallationEntry;Ljava/lang/Exception;)Z PLcom/google/firebase/installations/GetIdListener;->onStateReached(Lcom/google/firebase/installations/local/AutoValue_PersistedInstallationEntry;)Z PLcom/google/firebase/installations/RandomFidGenerator;->()V PLcom/google/firebase/installations/RandomFidGenerator;->()V PLcom/google/firebase/installations/Utils;->()V PLcom/google/firebase/installations/Utils;->()V PLcom/google/firebase/installations/local/AutoValue_PersistedInstallationEntry$Builder;->()V PLcom/google/firebase/installations/local/AutoValue_PersistedInstallationEntry$Builder;->setExpiresInSecs(J)Lcom/google/firebase/installations/local/AutoValue_PersistedInstallationEntry$Builder; PLcom/google/firebase/installations/local/AutoValue_PersistedInstallationEntry$Builder;->setRegistrationStatus$enumunboxing$(I)Lcom/google/firebase/installations/local/AutoValue_PersistedInstallationEntry$Builder; PLcom/google/firebase/installations/local/AutoValue_PersistedInstallationEntry$Builder;->setTokenCreationEpochInSecs(J)Lcom/google/firebase/installations/local/AutoValue_PersistedInstallationEntry$Builder; PLcom/google/firebase/installations/local/AutoValue_PersistedInstallationEntry;->()V PLcom/google/firebase/installations/local/AutoValue_PersistedInstallationEntry;->isErrored()Z PLcom/google/firebase/installations/local/AutoValue_PersistedInstallationEntry;->isNotGenerated()Z PLcom/google/firebase/installations/local/AutoValue_PersistedInstallationEntry;->isRegistered()Z PLcom/google/firebase/installations/local/AutoValue_PersistedInstallationEntry;->isUnregistered()Z PLcom/google/firebase/installations/local/AutoValue_PersistedInstallationEntry;->toBuilder()Lcom/google/firebase/installations/local/AutoValue_PersistedInstallationEntry$Builder; PLcom/google/firebase/installations/local/IidStore;->()V PLcom/google/firebase/installations/local/IidStore;->(Lcom/google/firebase/FirebaseApp;)V PLcom/google/firebase/installations/remote/AutoValue_InstallationResponse;->(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lcom/google/firebase/installations/remote/AutoValue_TokenResult;ILokio/Base64;)V PLcom/google/firebase/installations/remote/FirebaseInstallationServiceClient;->()V PLcom/google/firebase/installations/remote/FirebaseInstallationServiceClient;->(Landroid/content/Context;Lcom/google/firebase/platforminfo/DefaultUserAgentPublisher;Lcom/google/firebase/heartbeatinfo/DefaultHeartBeatInfo;)V PLcom/google/firebase/installations/remote/FirebaseInstallationServiceClient;->getFullyQualifiedRequestUri(Ljava/lang/String;)Ljava/net/URL; PLcom/google/firebase/installations/remote/FirebaseInstallationServiceClient;->writeFIDCreateRequestBodyToOutputStream(Ljava/net/HttpURLConnection;Ljava/lang/String;Ljava/lang/String;)V PLcom/google/firebase/installations/remote/FirebaseInstallationServiceClient;->writeRequestBodyToOutputStream(Ljava/net/URLConnection;[B)V PLcom/google/firebase/internal/DataCollectionConfigStorage;->(Landroid/content/Context;Ljava/lang/String;Lcom/google/firebase/events/Publisher;)V PLcom/google/firebase/ktx/FirebaseCommonKtxRegistrar;->()V PLcom/google/firebase/ktx/FirebaseCommonKtxRegistrar;->getComponents()Ljava/util/List; PLcom/google/firebase/messaging/FirebaseMessaging;->(Lcom/google/firebase/FirebaseApp;Lcom/google/firebase/iid/FirebaseInstanceId;Lcom/google/firebase/platforminfo/DefaultUserAgentPublisher;Lcom/google/firebase/heartbeatinfo/DefaultHeartBeatInfo;Lcom/google/firebase/installations/FirebaseInstallationsApi;Lcom/google/android/datatransport/TransportFactory;)V PLcom/google/firebase/messaging/FirebaseMessagingRegistrar;->()V PLcom/google/firebase/messaging/FirebaseMessagingRegistrar;->getComponents()Ljava/util/List; PLcom/google/firebase/messaging/zzj;->(ILandroidx/appcompat/R$id$$IA$1;)V PLcom/google/firebase/messaging/zzj;->(Landroid/content/Context;)V PLcom/google/firebase/messaging/zzj;->(Landroidx/room/RoomDatabase;)V PLcom/google/firebase/messaging/zzj;->(Ljava/lang/Object;Ljava/lang/Object;I)V PLcom/google/firebase/messaging/zzj;->(Ljava/lang/Object;Ljava/lang/Object;ILandroidx/appcompat/R$id$$IA$1;)V PLcom/google/firebase/messaging/zzj;->getEncodeStrategy$enumunboxing$(Lcom/bumptech/glide/load/Options;)I PLcom/google/firebase/messaging/zzj;->getOrAddEntryList(Ljava/lang/String;)Ljava/util/List; PLcom/google/firebase/messaging/zzj;->getResourceClasses(Ljava/lang/Class;Ljava/lang/Class;)Ljava/util/List; PLcom/google/firebase/messaging/zzj;->getString(Ljava/lang/String;)Ljava/lang/String; PLcom/google/firebase/messaging/zzj;->onTypefaceRequestFailed(I)V PLcom/google/firebase/messaging/zzj;->onTypefaceResult(Landroidx/core/provider/FontRequestWorker$TypefaceResult;)V PLcom/google/firebase/messaging/zzj;->release(Ljava/lang/String;)V PLcom/google/firebase/messaging/zzj;->writeTo(Lcom/google/firebase/crashlytics/internal/proto/CodedOutputStream;)V PLcom/google/firebase/messaging/zzl;->()V PLcom/google/firebase/messaging/zzl;->()V PLcom/google/firebase/messaging/zzl;->create(Lcom/google/firebase/components/ComponentContainer;)Ljava/lang/Object; PLcom/google/firebase/messaging/zzu;->()V PLcom/google/firebase/messaging/zzu;->(Lcom/google/firebase/FirebaseApp;Lcom/google/firebase/iid/FirebaseInstanceId;Lcom/google/firebase/iid/zzao;Lcom/google/firebase/platforminfo/DefaultUserAgentPublisher;Lcom/google/firebase/heartbeatinfo/DefaultHeartBeatInfo;Lcom/google/firebase/installations/FirebaseInstallationsApi;Landroid/content/Context;Ljava/util/concurrent/Executor;Ljava/util/concurrent/ScheduledExecutorService;)V PLcom/google/firebase/messaging/zzu;->zzf()Ljava/lang/String; PLcom/google/firebase/platforminfo/AutoValue_LibraryVersion;->(Ljava/lang/String;Ljava/lang/String;)V PLcom/google/firebase/platforminfo/AutoValue_LibraryVersion;->hashCode()I PLcom/google/firebase/platforminfo/DefaultUserAgentPublisher;->(Ljava/util/Set;Lokhttp3/internal/connection/RouteDatabase;)V PLcom/google/firebase/platforminfo/DefaultUserAgentPublisher;->toUserAgent(Ljava/util/Set;)Ljava/lang/String; PLcom/google/firebase/provider/FirebaseInitProvider;->()V PLcom/google/firebase/provider/FirebaseInitProvider;->attachInfo(Landroid/content/Context;Landroid/content/pm/ProviderInfo;)V PLcom/google/firebase/provider/FirebaseInitProvider;->onCreate()Z PLcom/google/firebase/remoteconfig/FirebaseRemoteConfig;->(Landroid/content/Context;Lcom/google/firebase/FirebaseApp;Lcom/google/firebase/iid/FirebaseInstanceId;Lcom/google/firebase/abt/FirebaseABTesting;Ljava/util/concurrent/Executor;Lcom/google/firebase/remoteconfig/internal/ConfigCacheClient;Lcom/google/firebase/remoteconfig/internal/ConfigCacheClient;Lcom/google/firebase/remoteconfig/internal/ConfigCacheClient;Lcom/google/firebase/remoteconfig/internal/ConfigFetchHandler;Lcom/google/firebase/remoteconfig/internal/ConfigGetParameterHandler;Lcom/google/firebase/remoteconfig/internal/ConfigMetadataClient;)V PLcom/google/firebase/remoteconfig/RemoteConfigComponent;->()V PLcom/google/firebase/remoteconfig/RemoteConfigComponent;->(Landroid/content/Context;Lcom/google/firebase/FirebaseApp;Lcom/google/firebase/iid/FirebaseInstanceId;Lcom/google/firebase/abt/FirebaseABTesting;Lcom/google/firebase/analytics/connector/AnalyticsConnector;)V PLcom/google/firebase/remoteconfig/RemoteConfigComponent;->get(Lcom/google/firebase/FirebaseApp;Ljava/lang/String;Lcom/google/firebase/iid/FirebaseInstanceId;Lcom/google/firebase/abt/FirebaseABTesting;Ljava/util/concurrent/Executor;Lcom/google/firebase/remoteconfig/internal/ConfigCacheClient;Lcom/google/firebase/remoteconfig/internal/ConfigCacheClient;Lcom/google/firebase/remoteconfig/internal/ConfigCacheClient;Lcom/google/firebase/remoteconfig/internal/ConfigFetchHandler;Lcom/google/firebase/remoteconfig/internal/ConfigGetParameterHandler;Lcom/google/firebase/remoteconfig/internal/ConfigMetadataClient;)Lcom/google/firebase/remoteconfig/FirebaseRemoteConfig; PLcom/google/firebase/remoteconfig/RemoteConfigComponent;->getCacheClient(Landroid/content/Context;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Lcom/google/firebase/remoteconfig/internal/ConfigCacheClient; PLcom/google/firebase/remoteconfig/RemoteConfigComponent;->getFetchHandler(Ljava/lang/String;Lcom/google/firebase/remoteconfig/internal/ConfigCacheClient;Lcom/google/firebase/remoteconfig/internal/ConfigMetadataClient;)Lcom/google/firebase/remoteconfig/internal/ConfigFetchHandler; PLcom/google/firebase/remoteconfig/RemoteConfigRegistrar;->()V PLcom/google/firebase/remoteconfig/RemoteConfigRegistrar;->getComponents()Ljava/util/List; PLcom/google/firebase/remoteconfig/RemoteConfigRegistrar;->lambda$getComponents$0(Lcom/google/firebase/components/ComponentContainer;)Lcom/google/firebase/remoteconfig/RemoteConfigComponent; PLcom/google/firebase/remoteconfig/internal/ConfigCacheClient;->()V PLcom/google/firebase/remoteconfig/internal/ConfigCacheClient;->(Ljava/util/concurrent/ExecutorService;Lcom/google/firebase/remoteconfig/internal/ConfigStorageClient;)V PLcom/google/firebase/remoteconfig/internal/ConfigCacheClient;->get()Lcom/google/android/gms/tasks/Task; PLcom/google/firebase/remoteconfig/internal/ConfigFetchHandler;->()V PLcom/google/firebase/remoteconfig/internal/ConfigFetchHandler;->(Lcom/google/firebase/iid/FirebaseInstanceId;Lcom/google/firebase/analytics/connector/AnalyticsConnector;Ljava/util/concurrent/Executor;Lcom/google/android/gms/common/util/Clock;Ljava/util/Random;Lcom/google/firebase/remoteconfig/internal/ConfigCacheClient;Lcom/google/firebase/remoteconfig/internal/ConfigFetchHttpClient;Lcom/google/firebase/remoteconfig/internal/ConfigMetadataClient;Ljava/util/Map;)V PLcom/google/firebase/remoteconfig/internal/ConfigFetchHttpClient;->()V PLcom/google/firebase/remoteconfig/internal/ConfigFetchHttpClient;->(Landroid/content/Context;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;JJ)V PLcom/google/firebase/remoteconfig/internal/ConfigGetParameterHandler;->()V PLcom/google/firebase/remoteconfig/internal/ConfigGetParameterHandler;->(Lcom/google/firebase/remoteconfig/internal/ConfigCacheClient;Lcom/google/firebase/remoteconfig/internal/ConfigCacheClient;)V PLcom/google/firebase/remoteconfig/internal/ConfigMetadataClient;->()V PLcom/google/firebase/remoteconfig/internal/ConfigMetadataClient;->(Landroid/content/SharedPreferences;)V PLcom/google/firebase/remoteconfig/internal/ConfigStorageClient;->()V PLcom/google/firebase/remoteconfig/internal/ConfigStorageClient;->(Landroid/content/Context;Ljava/lang/String;)V PLcom/google/firebase/remoteconfig/internal/LegacyConfigsHandler;->()V PLcom/google/firebase/remoteconfig/internal/LegacyConfigsHandler;->(Landroid/content/Context;Ljava/lang/String;)V PLcom/google/gson/DefaultDateTypeAdapter;->(Lcom/google/gson/Gson;Ljava/lang/reflect/Type;Lcom/google/gson/TypeAdapter;Lcom/google/gson/internal/ObjectConstructor;)V PLcom/google/gson/DefaultDateTypeAdapter;->write(Lcom/google/gson/stream/JsonWriter;Ljava/lang/Object;)V PLcom/google/gson/FieldNamingPolicy$1;->(Ljava/lang/String;I)V PLcom/google/gson/FieldNamingPolicy$1;->translateName(Ljava/lang/reflect/Field;)Ljava/lang/String; PLcom/google/gson/FieldNamingPolicy$2;->(Ljava/lang/String;I)V PLcom/google/gson/FieldNamingPolicy$3;->(Ljava/lang/String;I)V PLcom/google/gson/FieldNamingPolicy$4;->(Ljava/lang/String;I)V PLcom/google/gson/FieldNamingPolicy$5;->(Ljava/lang/String;I)V PLcom/google/gson/FieldNamingPolicy$6;->(Ljava/lang/String;I)V PLcom/google/gson/FieldNamingPolicy;->()V PLcom/google/gson/FieldNamingPolicy;->(Ljava/lang/String;ILcom/google/gson/FieldNamingPolicy$1;)V PLcom/google/gson/Gson$1;->(Lcom/google/gson/Gson;I)V PLcom/google/gson/Gson$3;->(I)V PLcom/google/gson/Gson$3;->write(Lcom/google/gson/stream/JsonWriter;Ljava/lang/Number;)V PLcom/google/gson/Gson$3;->write(Lcom/google/gson/stream/JsonWriter;Ljava/lang/Object;)V PLcom/google/gson/Gson$4;->(Lcom/google/gson/TypeAdapter;I)V PLcom/google/gson/Gson$FutureTypeAdapter;->()V PLcom/google/gson/Gson;->()V PLcom/google/gson/Gson;->newJsonWriter(Ljava/io/Writer;)Lcom/google/gson/stream/JsonWriter; PLcom/google/gson/Gson;->toJson(Ljava/lang/Object;Ljava/lang/reflect/Type;Lcom/google/gson/stream/JsonWriter;)V PLcom/google/gson/GsonBuilder;->()V PLcom/google/gson/GsonBuilder;->create()Lcom/google/gson/Gson; PLcom/google/gson/GsonBuilder;->registerTypeAdapter(Ljava/lang/reflect/Type;Ljava/lang/Object;)Lcom/google/gson/GsonBuilder; PLcom/google/gson/JsonPrimitive;->getAsInt()I PLcom/google/gson/LongSerializationPolicy$1;->(Ljava/lang/String;I)V PLcom/google/gson/LongSerializationPolicy$2;->(Ljava/lang/String;I)V PLcom/google/gson/LongSerializationPolicy;->()V PLcom/google/gson/LongSerializationPolicy;->(Ljava/lang/String;ILcom/google/gson/LongSerializationPolicy$1;)V PLcom/google/gson/TypeAdapter;->()V PLcom/google/gson/TypeAdapter;->nullSafe()Lcom/google/gson/TypeAdapter; PLcom/google/gson/internal/$Gson$Types$ParameterizedTypeImpl;->(Ljava/lang/reflect/Type;Ljava/lang/reflect/Type;[Ljava/lang/reflect/Type;)V PLcom/google/gson/internal/$Gson$Types$ParameterizedTypeImpl;->getActualTypeArguments()[Ljava/lang/reflect/Type; PLcom/google/gson/internal/$Gson$Types$ParameterizedTypeImpl;->getOwnerType()Ljava/lang/reflect/Type; PLcom/google/gson/internal/$Gson$Types$ParameterizedTypeImpl;->getRawType()Ljava/lang/reflect/Type; PLcom/google/gson/internal/$Gson$Types$ParameterizedTypeImpl;->hashCode()I PLcom/google/gson/internal/ConstructorConstructor$7;->(Landroidx/compose/runtime/SnapshotThreadLocal;I)V PLcom/google/gson/internal/ConstructorConstructor$7;->construct()Ljava/lang/Object; PLcom/google/gson/internal/Excluder;->()V PLcom/google/gson/internal/Excluder;->()V PLcom/google/gson/internal/Excluder;->create(Lcom/google/gson/Gson;Lcom/google/gson/reflect/TypeToken;)Lcom/google/gson/TypeAdapter; PLcom/google/gson/internal/Excluder;->excludeClassInStrategy(Ljava/lang/Class;Z)Z PLcom/google/gson/internal/Excluder;->isAnonymousOrLocal(Ljava/lang/Class;)Z PLcom/google/gson/internal/JavaVersion;->()V PLcom/google/gson/internal/LazilyParsedNumber;->intValue()I PLcom/google/gson/internal/LinkedTreeMap$KeySet$1;->(Lcom/google/gson/internal/LinkedTreeMap$KeySet;)V PLcom/google/gson/internal/LinkedTreeMap$KeySet$1;->next()Ljava/lang/Object; PLcom/google/gson/internal/LinkedTreeMap$KeySet;->(Lcom/google/gson/internal/LinkedTreeMap;I)V PLcom/google/gson/internal/LinkedTreeMap$KeySet;->iterator()Ljava/util/Iterator; PLcom/google/gson/internal/LinkedTreeMap$LinkedTreeMapIterator;->(Lcom/google/gson/internal/LinkedTreeMap;)V PLcom/google/gson/internal/LinkedTreeMap$LinkedTreeMapIterator;->hasNext()Z PLcom/google/gson/internal/LinkedTreeMap$LinkedTreeMapIterator;->nextNode()Lcom/google/gson/internal/LinkedTreeMap$Node; PLcom/google/gson/internal/LinkedTreeMap$Node;->getValue()Ljava/lang/Object; PLcom/google/gson/internal/LinkedTreeMap;->()V PLcom/google/gson/internal/LinkedTreeMap;->entrySet()Ljava/util/Set; PLcom/google/gson/internal/LinkedTreeMap;->get(Ljava/lang/Object;)Ljava/lang/Object; PLcom/google/gson/internal/LinkedTreeMap;->size()I PLcom/google/gson/internal/UnsafeAllocator$1;->(Ljava/lang/reflect/Method;Ljava/lang/Object;)V PLcom/google/gson/internal/UnsafeAllocator$1;->newInstance(Ljava/lang/Class;)Ljava/lang/Object; PLcom/google/gson/internal/bind/ArrayTypeAdapter;->()V PLcom/google/gson/internal/bind/CollectionTypeAdapterFactory;->(Landroidx/compose/runtime/SnapshotThreadLocal;I)V PLcom/google/gson/internal/bind/CollectionTypeAdapterFactory;->create(Lcom/google/gson/Gson;Lcom/google/gson/reflect/TypeToken;)Lcom/google/gson/TypeAdapter; PLcom/google/gson/internal/bind/DateTypeAdapter;->()V PLcom/google/gson/internal/bind/MapTypeAdapterFactory$Adapter;->(Lcom/google/gson/internal/bind/MapTypeAdapterFactory;Lcom/google/gson/Gson;Ljava/lang/reflect/Type;Lcom/google/gson/TypeAdapter;Ljava/lang/reflect/Type;Lcom/google/gson/TypeAdapter;Lcom/google/gson/internal/ObjectConstructor;)V PLcom/google/gson/internal/bind/MapTypeAdapterFactory;->(Landroidx/compose/runtime/SnapshotThreadLocal;Z)V PLcom/google/gson/internal/bind/MapTypeAdapterFactory;->create(Lcom/google/gson/Gson;Lcom/google/gson/reflect/TypeToken;)Lcom/google/gson/TypeAdapter; PLcom/google/gson/internal/bind/ObjectTypeAdapter;->()V PLcom/google/gson/internal/bind/ReflectiveTypeAdapterFactory$1;->(Lcom/google/gson/internal/bind/ReflectiveTypeAdapterFactory;Ljava/lang/String;ZZLjava/lang/reflect/Field;ZLcom/google/gson/TypeAdapter;Lcom/google/gson/Gson;Lcom/google/gson/reflect/TypeToken;Z)V PLcom/google/gson/internal/bind/ReflectiveTypeAdapterFactory$Adapter;->(Lcom/google/gson/internal/ObjectConstructor;Ljava/util/Map;)V PLcom/google/gson/internal/bind/ReflectiveTypeAdapterFactory$Adapter;->read(Lcom/google/gson/stream/JsonReader;)Ljava/lang/Object; PLcom/google/gson/internal/bind/ReflectiveTypeAdapterFactory$Adapter;->write(Lcom/google/gson/stream/JsonWriter;Ljava/lang/Object;)V PLcom/google/gson/internal/bind/ReflectiveTypeAdapterFactory;->(Landroidx/compose/runtime/SnapshotThreadLocal;Lcom/google/gson/FieldNamingStrategy;Lcom/google/gson/internal/Excluder;Lcom/google/gson/internal/bind/CollectionTypeAdapterFactory;)V PLcom/google/gson/internal/bind/ReflectiveTypeAdapterFactory;->excludeField(Ljava/lang/reflect/Field;Z)Z PLcom/google/gson/internal/bind/SqlDateTypeAdapter;->()V PLcom/google/gson/internal/bind/TimeTypeAdapter;->()V PLcom/google/gson/internal/bind/TreeTypeAdapter$SingleTypeFactory;->(Ljava/lang/Object;Lcom/google/gson/reflect/TypeToken;ZLjava/lang/Class;)V PLcom/google/gson/internal/bind/TreeTypeAdapter$SingleTypeFactory;->create(Lcom/google/gson/Gson;Lcom/google/gson/reflect/TypeToken;)Lcom/google/gson/TypeAdapter; PLcom/google/gson/internal/bind/TreeTypeAdapter;->(Lcom/google/gson/JsonSerializer;Lcom/google/gson/JsonDeserializer;Lcom/google/gson/Gson;Lcom/google/gson/reflect/TypeToken;Lcom/google/gson/TypeAdapterFactory;)V PLcom/google/gson/internal/bind/TypeAdapters$26;->(I)V PLcom/google/gson/internal/bind/TypeAdapters$26;->create(Lcom/google/gson/Gson;Lcom/google/gson/reflect/TypeToken;)Lcom/google/gson/TypeAdapter; PLcom/google/gson/internal/bind/TypeAdapters$32;->(Ljava/lang/Object;Lcom/google/gson/TypeAdapter;I)V PLcom/google/gson/internal/bind/TypeAdapters$32;->create(Lcom/google/gson/Gson;Lcom/google/gson/reflect/TypeToken;)Lcom/google/gson/TypeAdapter; PLcom/google/gson/internal/bind/TypeAdapters$33;->(Ljava/lang/Class;Ljava/lang/Class;Lcom/google/gson/TypeAdapter;I)V PLcom/google/gson/internal/bind/TypeAdapters$33;->create(Lcom/google/gson/Gson;Lcom/google/gson/reflect/TypeToken;)Lcom/google/gson/TypeAdapter; PLcom/google/gson/internal/bind/TypeAdapters;->()V PLcom/google/gson/internal/bind/TypeAdapters;->newFactory(Ljava/lang/Class;Lcom/google/gson/TypeAdapter;)Lcom/google/gson/TypeAdapterFactory; PLcom/google/gson/internal/bind/TypeAdapters;->newFactory(Ljava/lang/Class;Ljava/lang/Class;Lcom/google/gson/TypeAdapter;)Lcom/google/gson/TypeAdapterFactory; PLcom/google/gson/internal/reflect/PreJava9ReflectionAccessor;->()V PLcom/google/gson/internal/reflect/PreJava9ReflectionAccessor;->makeAccessible(Ljava/lang/reflect/AccessibleObject;)V PLcom/google/gson/internal/reflect/ReflectionAccessor;->()V PLcom/google/gson/internal/reflect/ReflectionAccessor;->()V PLcom/google/gson/reflect/TypeToken;->hashCode()I PLcom/google/gson/stream/JsonReader;->()V PLcom/google/gson/stream/JsonReader;->(Ljava/io/Reader;)V PLcom/google/gson/stream/JsonWriter;->()V PLcom/google/gson/stream/JsonWriter;->(Ljava/io/Writer;)V PLcom/google/gson/stream/JsonWriter;->beginArray()Lcom/google/gson/stream/JsonWriter; PLcom/google/gson/stream/JsonWriter;->beginObject()Lcom/google/gson/stream/JsonWriter; PLcom/google/gson/stream/JsonWriter;->close(IIC)Lcom/google/gson/stream/JsonWriter; PLcom/google/gson/stream/JsonWriter;->endArray()Lcom/google/gson/stream/JsonWriter; PLcom/google/gson/stream/JsonWriter;->endObject()Lcom/google/gson/stream/JsonWriter; PLcom/google/gson/stream/JsonWriter;->name(Ljava/lang/String;)Lcom/google/gson/stream/JsonWriter; PLcom/google/gson/stream/JsonWriter;->newline()V PLcom/google/gson/stream/JsonWriter;->push(I)V PLcom/google/gson/stream/JsonWriter;->replaceTop(I)V PLcom/google/gson/stream/JsonWriter;->value(Ljava/lang/Number;)Lcom/google/gson/stream/JsonWriter; PLcom/google/gson/stream/JsonWriter;->value(Ljava/lang/String;)Lcom/google/gson/stream/JsonWriter; PLcom/google/gson/stream/JsonWriter;->writeDeferredName()V PLcom/google/samples/apps/iosched/DaggerMainApplication_HiltComponents_SingletonC$ActivityCBuilder;->(Lcom/google/samples/apps/iosched/DaggerMainApplication_HiltComponents_SingletonC;Lcom/google/samples/apps/iosched/DaggerMainApplication_HiltComponents_SingletonC$ActivityRetainedCImpl;)V PLcom/google/samples/apps/iosched/DaggerMainApplication_HiltComponents_SingletonC$ActivityCImpl;->(Lcom/google/samples/apps/iosched/DaggerMainApplication_HiltComponents_SingletonC;Lcom/google/samples/apps/iosched/DaggerMainApplication_HiltComponents_SingletonC$ActivityRetainedCImpl;Landroid/app/Activity;)V PLcom/google/samples/apps/iosched/DaggerMainApplication_HiltComponents_SingletonC$ActivityRetainedCImpl$SwitchingProvider;->(Lcom/google/samples/apps/iosched/DaggerMainApplication_HiltComponents_SingletonC;Lcom/google/samples/apps/iosched/DaggerMainApplication_HiltComponents_SingletonC$ActivityRetainedCImpl;I)V PLcom/google/samples/apps/iosched/DaggerMainApplication_HiltComponents_SingletonC$ActivityRetainedCImpl$SwitchingProvider;->get()Ljava/lang/Object; PLcom/google/samples/apps/iosched/DaggerMainApplication_HiltComponents_SingletonC$ActivityRetainedCImpl;->(Lcom/google/samples/apps/iosched/DaggerMainApplication_HiltComponents_SingletonC;Lcom/google/common/collect/Maps;)V PLcom/google/samples/apps/iosched/DaggerMainApplication_HiltComponents_SingletonC$FragmentCImpl$SwitchingProvider;->(Lcom/google/samples/apps/iosched/DaggerMainApplication_HiltComponents_SingletonC;Lcom/google/samples/apps/iosched/DaggerMainApplication_HiltComponents_SingletonC$ActivityRetainedCImpl;Lcom/google/samples/apps/iosched/DaggerMainApplication_HiltComponents_SingletonC$ActivityCImpl;Lcom/google/samples/apps/iosched/DaggerMainApplication_HiltComponents_SingletonC$FragmentCImpl;I)V PLcom/google/samples/apps/iosched/DaggerMainApplication_HiltComponents_SingletonC$FragmentCImpl$SwitchingProvider;->get()Ljava/lang/Object; PLcom/google/samples/apps/iosched/DaggerMainApplication_HiltComponents_SingletonC$FragmentCImpl;->(Lcom/google/samples/apps/iosched/DaggerMainApplication_HiltComponents_SingletonC;Lcom/google/samples/apps/iosched/DaggerMainApplication_HiltComponents_SingletonC$ActivityRetainedCImpl;Lcom/google/samples/apps/iosched/DaggerMainApplication_HiltComponents_SingletonC$ActivityCImpl;Lio/grpc/Metadata$1;Landroidx/fragment/app/Fragment;Lcom/google/common/collect/Maps;)V PLcom/google/samples/apps/iosched/DaggerMainApplication_HiltComponents_SingletonC$SwitchingProvider;->(Lcom/google/samples/apps/iosched/DaggerMainApplication_HiltComponents_SingletonC;I)V PLcom/google/samples/apps/iosched/DaggerMainApplication_HiltComponents_SingletonC$ViewModelCImpl$SwitchingProvider;->(Lcom/google/samples/apps/iosched/DaggerMainApplication_HiltComponents_SingletonC;Lcom/google/samples/apps/iosched/DaggerMainApplication_HiltComponents_SingletonC$ActivityRetainedCImpl;Lcom/google/samples/apps/iosched/DaggerMainApplication_HiltComponents_SingletonC$ViewModelCImpl;I)V PLcom/google/samples/apps/iosched/DaggerMainApplication_HiltComponents_SingletonC$ViewModelCImpl$SwitchingProvider;->get()Ljava/lang/Object; PLcom/google/samples/apps/iosched/DaggerMainApplication_HiltComponents_SingletonC$ViewModelCImpl;->access$4600(Lcom/google/samples/apps/iosched/DaggerMainApplication_HiltComponents_SingletonC$ViewModelCImpl;)Lcom/google/samples/apps/iosched/shared/domain/settings/GetThemeUseCase; PLcom/google/samples/apps/iosched/DaggerMainApplication_HiltComponents_SingletonC$ViewModelCImpl;->access$6800(Lcom/google/samples/apps/iosched/DaggerMainApplication_HiltComponents_SingletonC$ViewModelCImpl;)Lcom/google/samples/apps/iosched/ui/sessioncommon/OnSessionStarClickDelegate; PLcom/google/samples/apps/iosched/DaggerMainApplication_HiltComponents_SingletonC;->(Lio/grpc/Metadata$2;Landroidx/appcompat/view/ActionBarPolicy;Lcom/google/samples/apps/iosched/di/SignInModule;Lio/grpc/Metadata$2;Lcom/google/samples/apps/iosched/di/SignInModule;Lcom/google/samples/apps/iosched/di/SignInModule;Lio/grpc/Metadata$2;Lcom/google/common/collect/Maps;)V PLcom/google/samples/apps/iosched/DaggerMainApplication_HiltComponents_SingletonC;->access$1400(Lcom/google/samples/apps/iosched/DaggerMainApplication_HiltComponents_SingletonC;)Z PLcom/google/samples/apps/iosched/DaggerMainApplication_HiltComponents_SingletonC;->access$4400(Lcom/google/samples/apps/iosched/DaggerMainApplication_HiltComponents_SingletonC;)Z PLcom/google/samples/apps/iosched/DataBinderMapperImpl;->()V PLcom/google/samples/apps/iosched/DataBinderMapperImpl;->()V PLcom/google/samples/apps/iosched/DataBinderMapperImpl;->collectDependencies()Ljava/util/List; PLcom/google/samples/apps/iosched/Hilt_MainApplication;->()V PLcom/google/samples/apps/iosched/Hilt_MainApplication;->generatedComponent()Ljava/lang/Object; PLcom/google/samples/apps/iosched/Hilt_MainApplication;->onCreate()V PLcom/google/samples/apps/iosched/MainApplication;->()V PLcom/google/samples/apps/iosched/databinding/FragmentScheduleBinding;->(Ljava/lang/Object;Landroid/view/View;ILcom/google/android/material/appbar/AppBarLayout;Landroidx/coordinatorlayout/widget/CoordinatorLayout;Landroidx/recyclerview/widget/RecyclerView;Landroid/widget/TextView;Landroid/widget/ProgressBar;Landroidx/recyclerview/widget/RecyclerView;Lcom/google/samples/apps/iosched/widget/FadingSnackbar;Lcom/google/samples/apps/iosched/widget/CustomSwipeRefreshLayout;Landroidx/appcompat/widget/Toolbar;)V PLcom/google/samples/apps/iosched/databinding/FragmentScheduleBindingImpl;->()V PLcom/google/samples/apps/iosched/databinding/FragmentScheduleBindingImpl;->(Landroidx/databinding/DataBindingComponent;Landroid/view/View;)V PLcom/google/samples/apps/iosched/databinding/FragmentScheduleBindingImpl;->executeBindings()V PLcom/google/samples/apps/iosched/databinding/FragmentScheduleBindingImpl;->hasPendingBindings()Z PLcom/google/samples/apps/iosched/databinding/FragmentScheduleBindingImpl;->invalidateAll()V PLcom/google/samples/apps/iosched/databinding/FragmentScheduleBindingImpl;->onFieldChange(ILjava/lang/Object;I)Z PLcom/google/samples/apps/iosched/databinding/FragmentScheduleBindingImpl;->setIsEmpty(Z)V PLcom/google/samples/apps/iosched/databinding/FragmentScheduleBindingImpl;->setViewModel(Lcom/google/samples/apps/iosched/ui/schedule/ScheduleViewModel;)V PLcom/google/samples/apps/iosched/databinding/ItemInlineTagBinding;->(Ljava/lang/Object;Landroid/view/View;I)V PLcom/google/samples/apps/iosched/databinding/ItemInlineTagBindingImpl;->hasPendingBindings()Z PLcom/google/samples/apps/iosched/databinding/ItemInlineTagBindingImpl;->invalidateAll()V PLcom/google/samples/apps/iosched/databinding/ItemScheduleDayIndicatorBinding;->(Ljava/lang/Object;Landroid/view/View;ILandroid/widget/CheckedTextView;)V PLcom/google/samples/apps/iosched/databinding/ItemScheduleDayIndicatorBindingImpl;->(Landroidx/databinding/DataBindingComponent;Landroid/view/View;)V PLcom/google/samples/apps/iosched/databinding/ItemScheduleDayIndicatorBindingImpl;->executeBindings()V PLcom/google/samples/apps/iosched/databinding/ItemScheduleDayIndicatorBindingImpl;->hasPendingBindings()Z PLcom/google/samples/apps/iosched/databinding/ItemScheduleDayIndicatorBindingImpl;->invalidateAll()V PLcom/google/samples/apps/iosched/databinding/ItemScheduleDayIndicatorBindingImpl;->setIndicator(Lcom/google/samples/apps/iosched/ui/schedule/DayIndicator;)V PLcom/google/samples/apps/iosched/databinding/ItemScheduleDayIndicatorBindingImpl;->setViewModel(Lcom/google/samples/apps/iosched/ui/schedule/ScheduleViewModel;)V PLcom/google/samples/apps/iosched/databinding/ItemSessionBinding;->(Ljava/lang/Object;Landroid/view/View;ILcom/google/android/material/internal/CheckableImageButton;Landroidx/constraintlayout/widget/Guideline;Landroidx/constraintlayout/widget/Guideline;Landroid/widget/TextView;Landroid/widget/ImageView;Lcom/google/samples/apps/iosched/ui/reservation/ReservationTextView;Lcom/google/samples/apps/iosched/widget/NoTouchRecyclerView;Landroidx/constraintlayout/widget/Barrier;Landroid/widget/TextView;)V PLcom/google/samples/apps/iosched/databinding/ItemSessionBinding;->inflate(Landroid/view/LayoutInflater;Landroid/view/ViewGroup;Z)Lcom/google/samples/apps/iosched/databinding/ItemSessionBinding; PLcom/google/samples/apps/iosched/databinding/ItemSessionBindingImpl;->()V PLcom/google/samples/apps/iosched/databinding/ItemSessionBindingImpl;->invalidateAll()V PLcom/google/samples/apps/iosched/databinding/ItemSessionBindingImpl;->onFieldChange(ILjava/lang/Object;I)Z PLcom/google/samples/apps/iosched/databinding/ItemSessionBindingImpl;->setSessionClickListener(Lcom/google/samples/apps/iosched/ui/sessioncommon/OnSessionClickListener;)V PLcom/google/samples/apps/iosched/databinding/ItemSessionBindingImpl;->setSessionStarClickListener(Lcom/google/samples/apps/iosched/ui/sessioncommon/OnSessionStarClickListener;)V PLcom/google/samples/apps/iosched/databinding/ItemSessionBindingImpl;->setShowReservations(Lkotlinx/coroutines/flow/StateFlow;)V PLcom/google/samples/apps/iosched/databinding/ItemSessionBindingImpl;->setShowTime(Ljava/lang/Boolean;)V PLcom/google/samples/apps/iosched/databinding/ItemSessionBindingImpl;->setTimeZoneId(Lkotlinx/coroutines/flow/StateFlow;)V PLcom/google/samples/apps/iosched/di/PreferencesStorageModule;->()V PLcom/google/samples/apps/iosched/di/PreferencesStorageModule;->()V PLcom/google/samples/apps/iosched/di/SignInModule;->(I)V PLcom/google/samples/apps/iosched/di/SignInModule;->(Lkotlin/LazyKt__LazyKt;I)V PLcom/google/samples/apps/iosched/model/Codelab;->(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;ILjava/util/List;)V PLcom/google/samples/apps/iosched/model/Codelab;->getDescription()Ljava/lang/String; PLcom/google/samples/apps/iosched/model/Codelab;->getId()Ljava/lang/String; PLcom/google/samples/apps/iosched/model/Codelab;->getTitle()Ljava/lang/String; PLcom/google/samples/apps/iosched/model/ConferenceData;->(Ljava/util/List;Ljava/util/List;Ljava/util/List;Ljava/util/List;Ljava/util/List;I)V PLcom/google/samples/apps/iosched/model/ConferenceData;->copy$default(Lcom/google/samples/apps/iosched/model/ConferenceData;Ljava/util/List;Ljava/util/List;Ljava/util/List;Ljava/util/List;Ljava/util/List;II)Lcom/google/samples/apps/iosched/model/ConferenceData; PLcom/google/samples/apps/iosched/model/ConferenceData;->getCodelabs()Ljava/util/List; PLcom/google/samples/apps/iosched/model/ConferenceData;->getRooms()Ljava/util/List; PLcom/google/samples/apps/iosched/model/ConferenceData;->getSessions()Ljava/util/List; PLcom/google/samples/apps/iosched/model/ConferenceData;->getSpeakers()Ljava/util/List; PLcom/google/samples/apps/iosched/model/ConferenceData;->getTags()Ljava/util/List; PLcom/google/samples/apps/iosched/model/ConferenceDay;->(Lorg/threeten/bp/ZonedDateTime;Lorg/threeten/bp/ZonedDateTime;)V PLcom/google/samples/apps/iosched/model/ConferenceDay;->getEnd()Lorg/threeten/bp/ZonedDateTime; PLcom/google/samples/apps/iosched/model/ConferenceDay;->hashCode()I PLcom/google/samples/apps/iosched/model/Room;->(Ljava/lang/String;Ljava/lang/String;)V PLcom/google/samples/apps/iosched/model/Session$type$2;->invoke()Ljava/lang/Object; PLcom/google/samples/apps/iosched/model/Session;->copy$default(Lcom/google/samples/apps/iosched/model/Session;Ljava/lang/String;Lorg/threeten/bp/ZonedDateTime;Lorg/threeten/bp/ZonedDateTime;Ljava/lang/String;Ljava/lang/String;Lcom/google/samples/apps/iosched/model/Room;Ljava/lang/String;ZLjava/lang/String;Ljava/lang/String;Ljava/util/List;Ljava/util/List;Ljava/util/Set;Ljava/lang/String;Ljava/util/Set;I)Lcom/google/samples/apps/iosched/model/Session; PLcom/google/samples/apps/iosched/model/Session;->equals(Ljava/lang/Object;)Z PLcom/google/samples/apps/iosched/model/Session;->getDescription()Ljava/lang/String; PLcom/google/samples/apps/iosched/model/Session;->getEndTime()Lorg/threeten/bp/ZonedDateTime; PLcom/google/samples/apps/iosched/model/Session;->getSpeakers()Ljava/util/Set; PLcom/google/samples/apps/iosched/model/SessionType$Companion;->(Lkotlin/LazyKt__LazyKt;)V PLcom/google/samples/apps/iosched/model/SessionType;->()V PLcom/google/samples/apps/iosched/model/SessionType;->(Ljava/lang/String;ILjava/lang/String;)V PLcom/google/samples/apps/iosched/model/SessionType;->access$getReservableTypes$cp()Ljava/util/List; PLcom/google/samples/apps/iosched/model/Speaker;->(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V PLcom/google/samples/apps/iosched/model/Speaker;->copy$default(Lcom/google/samples/apps/iosched/model/Speaker;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;I)Lcom/google/samples/apps/iosched/model/Speaker; PLcom/google/samples/apps/iosched/model/Speaker;->getBiography()Ljava/lang/String; PLcom/google/samples/apps/iosched/model/Speaker;->getId()Ljava/lang/String; PLcom/google/samples/apps/iosched/model/Speaker;->getName()Ljava/lang/String; PLcom/google/samples/apps/iosched/model/Tag$Companion;->(Lkotlin/LazyKt__LazyKt;)V PLcom/google/samples/apps/iosched/model/Tag;->()V PLcom/google/samples/apps/iosched/model/Tag;->(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILjava/lang/String;ILjava/lang/Integer;)V PLcom/google/samples/apps/iosched/model/Tag;->getColor()I PLcom/google/samples/apps/iosched/model/Tag;->getDisplayName()Ljava/lang/String; PLcom/google/samples/apps/iosched/model/Theme;->()V PLcom/google/samples/apps/iosched/model/Theme;->(Ljava/lang/String;ILjava/lang/String;)V PLcom/google/samples/apps/iosched/model/Theme;->getStorageKey()Ljava/lang/String; PLcom/google/samples/apps/iosched/model/Theme;->values()[Lcom/google/samples/apps/iosched/model/Theme; PLcom/google/samples/apps/iosched/model/reservations/ReservationRequestResult$ReservationRequestStatus$Companion;->(Lkotlin/LazyKt__LazyKt;)V PLcom/google/samples/apps/iosched/model/reservations/ReservationRequestResult$ReservationRequestStatus;->()V PLcom/google/samples/apps/iosched/model/reservations/ReservationRequestResult$ReservationRequestStatus;->(Ljava/lang/String;I)V PLcom/google/samples/apps/iosched/model/reservations/ReservationRequestResult;->(Lcom/google/samples/apps/iosched/model/reservations/ReservationRequestResult$ReservationRequestStatus;Ljava/lang/String;J)V PLcom/google/samples/apps/iosched/model/schedule/PinnedSessionsSchedule;->(Ljava/util/List;)V PLcom/google/samples/apps/iosched/model/userdata/UserEvent$ReservationStatus$Companion;->(Lkotlin/LazyKt__LazyKt;)V PLcom/google/samples/apps/iosched/model/userdata/UserEvent$ReservationStatus;->()V PLcom/google/samples/apps/iosched/model/userdata/UserEvent$ReservationStatus;->(Ljava/lang/String;I)V PLcom/google/samples/apps/iosched/model/userdata/UserEvent;->getId()Ljava/lang/String; PLcom/google/samples/apps/iosched/model/userdata/UserEvent;->isStarredOrReserved()Z PLcom/google/samples/apps/iosched/model/userdata/UserEvent;->isWaitlisted()Z PLcom/google/samples/apps/iosched/model/userdata/UserSession;->equals(Ljava/lang/Object;)Z PLcom/google/samples/apps/iosched/shared/data/BootstrapConferenceDataSource;->()V PLcom/google/samples/apps/iosched/shared/data/BootstrapConferenceDataSource;->()V PLcom/google/samples/apps/iosched/shared/data/ConferenceDataRepository;->(Lcom/google/samples/apps/iosched/shared/data/ConferenceDataSource;Lcom/google/samples/apps/iosched/shared/data/ConferenceDataSource;Lcom/google/samples/apps/iosched/shared/data/db/AppDatabase;)V PLcom/google/samples/apps/iosched/shared/data/ConferenceDataRepository;->getOfflineConferenceData()Lcom/google/samples/apps/iosched/model/ConferenceData; PLcom/google/samples/apps/iosched/shared/data/FakeAppConfigDataSource;->()V PLcom/google/samples/apps/iosched/shared/data/FakeConferenceDataSource;->()V PLcom/google/samples/apps/iosched/shared/data/FakeConferenceDataSource;->()V PLcom/google/samples/apps/iosched/shared/data/FakeConferenceDataSource;->getOfflineConferenceData()Lcom/google/samples/apps/iosched/model/ConferenceData; PLcom/google/samples/apps/iosched/shared/data/TempConferenceData;->getRooms()Ljava/util/List; PLcom/google/samples/apps/iosched/shared/data/TempConferenceData;->getSessions()Ljava/util/List; PLcom/google/samples/apps/iosched/shared/data/TempConferenceData;->getSpeakers()Ljava/util/Map; PLcom/google/samples/apps/iosched/shared/data/TempConferenceData;->getTags()Ljava/util/List; PLcom/google/samples/apps/iosched/shared/data/ar/FakeArDebugFlagEndpoint;->()V PLcom/google/samples/apps/iosched/shared/data/ar/FakeArDebugFlagEndpoint;->()V PLcom/google/samples/apps/iosched/shared/data/db/AppDatabase;->()V PLcom/google/samples/apps/iosched/shared/data/db/AppDatabase;->()V PLcom/google/samples/apps/iosched/shared/data/db/AppDatabase_Impl$1;->(Lcom/google/samples/apps/iosched/shared/data/db/AppDatabase_Impl;I)V PLcom/google/samples/apps/iosched/shared/data/db/AppDatabase_Impl;->()V PLcom/google/samples/apps/iosched/shared/data/db/AppDatabase_Impl;->codelabFtsDao()Landroidx/lifecycle/ViewModelProvider; PLcom/google/samples/apps/iosched/shared/data/db/AppDatabase_Impl;->createInvalidationTracker()Landroidx/room/InvalidationTracker; PLcom/google/samples/apps/iosched/shared/data/db/AppDatabase_Impl;->createOpenHelper(Landroidx/room/DatabaseConfiguration;)Landroidx/sqlite/db/SupportSQLiteOpenHelper; PLcom/google/samples/apps/iosched/shared/data/db/AppDatabase_Impl;->getAutoMigrations(Ljava/util/Map;)Ljava/util/List; PLcom/google/samples/apps/iosched/shared/data/db/AppDatabase_Impl;->getRequiredAutoMigrationSpecs()Ljava/util/Set; PLcom/google/samples/apps/iosched/shared/data/db/AppDatabase_Impl;->getRequiredTypeConverters()Ljava/util/Map; PLcom/google/samples/apps/iosched/shared/data/db/AppDatabase_Impl;->sessionFtsDao()Landroidx/compose/runtime/SnapshotThreadLocal; PLcom/google/samples/apps/iosched/shared/data/db/AppDatabase_Impl;->speakerFtsDao()Lcom/google/firebase/messaging/zzj; PLcom/google/samples/apps/iosched/shared/data/db/CodelabFtsDao_Impl$1;->(Ljava/lang/Object;Landroidx/room/RoomDatabase;I)V PLcom/google/samples/apps/iosched/shared/data/db/CodelabFtsEntity;->(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V PLcom/google/samples/apps/iosched/shared/data/db/SpeakerFtsEntity;->(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V PLcom/google/samples/apps/iosched/shared/data/login/datasources/StagingAuthStateUserDataSource;->(ZZLjava/lang/String;Landroid/content/Context;Lcom/google/samples/apps/iosched/shared/domain/sessions/NotificationAlarmUpdater;)V PLcom/google/samples/apps/iosched/shared/data/login/datasources/StagingAuthenticatedUserInfo;->(Landroid/content/Context;ZZLjava/lang/String;I)V PLcom/google/samples/apps/iosched/shared/data/login/datasources/StagingAuthenticatedUserInfo;->getDisplayName()Ljava/lang/String; PLcom/google/samples/apps/iosched/shared/data/login/datasources/StagingAuthenticatedUserInfo;->getPhotoUrl()Landroid/net/Uri; PLcom/google/samples/apps/iosched/shared/data/login/datasources/StagingAuthenticatedUserInfo;->getUid()Ljava/lang/String; PLcom/google/samples/apps/iosched/shared/data/login/datasources/StagingAuthenticatedUserInfo;->isSignedIn()Z PLcom/google/samples/apps/iosched/shared/data/login/datasources/StagingRegisteredUserDataSource;->(Z)V PLcom/google/samples/apps/iosched/shared/data/prefs/DataStorePreferenceStorage$PreferencesKeys;->()V PLcom/google/samples/apps/iosched/shared/data/prefs/DataStorePreferenceStorage$areScheduleUiHintsShown$$inlined$map$1$2$1;->(Landroidx/compose/material/SwipeableState$special$$inlined$filter$1$2;Lkotlin/coroutines/Continuation;)V PLcom/google/samples/apps/iosched/shared/data/prefs/DataStorePreferenceStorage$special$$inlined$map$1$2$1;->(Landroidx/compose/material/SwipeableState$special$$inlined$filter$1$2;Lkotlin/coroutines/Continuation;)V PLcom/google/samples/apps/iosched/shared/data/prefs/DataStorePreferenceStorage$special$$inlined$map$2$2$1;->(Landroidx/compose/material/SwipeableState$special$$inlined$filter$1$2;Lkotlin/coroutines/Continuation;)V PLcom/google/samples/apps/iosched/shared/data/prefs/DataStorePreferenceStorage$special$$inlined$map$3$2$1;->(Landroidx/compose/material/SwipeableState$special$$inlined$filter$1$2;Lkotlin/coroutines/Continuation;)V PLcom/google/samples/apps/iosched/shared/data/prefs/DataStorePreferenceStorage$special$$inlined$map$4$2$1;->(Landroidx/compose/material/SwipeableState$special$$inlined$filter$1$2;Lkotlin/coroutines/Continuation;)V PLcom/google/samples/apps/iosched/shared/data/prefs/DataStorePreferenceStorage$special$$inlined$map$5$2$1;->(Landroidx/compose/material/SwipeableState$special$$inlined$filter$1$2;Lkotlin/coroutines/Continuation;)V PLcom/google/samples/apps/iosched/shared/data/prefs/DataStorePreferenceStorage$special$$inlined$map$6$2$1;->(Landroidx/compose/material/SwipeableState$special$$inlined$filter$1$2;Lkotlin/coroutines/Continuation;)V PLcom/google/samples/apps/iosched/shared/data/prefs/DataStorePreferenceStorage$special$$inlined$map$8$2$1;->(Landroidx/compose/material/SwipeableState$special$$inlined$filter$1$2;Lkotlin/coroutines/Continuation;)V PLcom/google/samples/apps/iosched/shared/data/prefs/DataStorePreferenceStorage$special$$inlined$map$9$2$1;->(Landroidx/compose/material/SwipeableState$special$$inlined$filter$1$2;Lkotlin/coroutines/Continuation;)V PLcom/google/samples/apps/iosched/shared/data/prefs/DataStorePreferenceStorage;->(Landroidx/datastore/core/DataStore;)V PLcom/google/samples/apps/iosched/shared/data/session/DefaultSessionRepository;->(Lcom/google/samples/apps/iosched/shared/data/ConferenceDataRepository;)V PLcom/google/samples/apps/iosched/shared/data/session/DefaultSessionRepository;->getSessions()Ljava/util/List; PLcom/google/samples/apps/iosched/shared/data/session/json/CodelabTemp;->(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;Ljava/util/List;I)V PLcom/google/samples/apps/iosched/shared/data/session/json/TagDeserializer;->(I)V PLcom/google/samples/apps/iosched/shared/data/signin/FirebaseRegisteredUserInfo;->(Lcom/google/samples/apps/iosched/shared/data/signin/AuthenticatedUserInfo;Ljava/lang/Boolean;)V PLcom/google/samples/apps/iosched/shared/data/signin/FirebaseRegisteredUserInfo;->getDisplayName()Ljava/lang/String; PLcom/google/samples/apps/iosched/shared/data/signin/FirebaseRegisteredUserInfo;->getPhotoUrl()Landroid/net/Uri; PLcom/google/samples/apps/iosched/shared/data/signin/FirebaseRegisteredUserInfo;->getUid()Ljava/lang/String; PLcom/google/samples/apps/iosched/shared/data/signin/FirebaseRegisteredUserInfo;->isRegistered()Z PLcom/google/samples/apps/iosched/shared/data/signin/FirebaseRegisteredUserInfo;->isSignedIn()Z PLcom/google/samples/apps/iosched/shared/data/userevent/DefaultSessionAndUserEventRepository$getObservableUserEvents$1$invokeSuspend$$inlined$map$1$2$1;->(Lkotlinx/coroutines/flow/StartedLazily$command$1$1;Lkotlin/coroutines/Continuation;)V PLcom/google/samples/apps/iosched/shared/data/userevent/DefaultSessionAndUserEventRepository$getObservableUserEvents$1;->(Ljava/lang/String;Lcom/google/samples/apps/iosched/shared/data/userevent/DefaultSessionAndUserEventRepository;Lkotlin/coroutines/Continuation;)V PLcom/google/samples/apps/iosched/shared/data/userevent/DefaultSessionAndUserEventRepository$getObservableUserEvents$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLcom/google/samples/apps/iosched/shared/data/userevent/DefaultSessionAndUserEventRepository$getObservableUserEvents$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLcom/google/samples/apps/iosched/shared/data/userevent/DefaultSessionAndUserEventRepository;->(Lcom/google/samples/apps/iosched/shared/data/userevent/UserEventDataSource;Lcom/google/samples/apps/iosched/shared/data/session/DefaultSessionRepository;)V PLcom/google/samples/apps/iosched/shared/data/userevent/DefaultSessionAndUserEventRepository;->getObservableUserEvents(Ljava/lang/String;)Lkotlinx/coroutines/flow/Flow; PLcom/google/samples/apps/iosched/shared/data/userevent/FakeUserEventDataSource$getObservableUserEvents$1;->(Lkotlin/coroutines/Continuation;)V PLcom/google/samples/apps/iosched/shared/data/userevent/FakeUserEventDataSource$getObservableUserEvents$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLcom/google/samples/apps/iosched/shared/data/userevent/FakeUserEventDataSource$getObservableUserEvents$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLcom/google/samples/apps/iosched/shared/data/userevent/FakeUserEventDataSource;->()V PLcom/google/samples/apps/iosched/shared/data/userevent/FakeUserEventDataSource;->()V PLcom/google/samples/apps/iosched/shared/data/userevent/ObservableUserEvents;->(Ljava/util/List;Lcom/google/samples/apps/iosched/model/Session;)V PLcom/google/samples/apps/iosched/shared/data/userevent/ObservableUserEvents;->(Ljava/util/List;Lcom/google/samples/apps/iosched/model/Session;I)V PLcom/google/samples/apps/iosched/shared/data/userevent/UserEventsResult;->(Ljava/util/List;I)V PLcom/google/samples/apps/iosched/shared/domain/FlowUseCase$invoke$1;->(Lcom/google/samples/apps/iosched/shared/domain/ar/LoadArDebugFlagUseCase;Lkotlin/coroutines/Continuation;)V PLcom/google/samples/apps/iosched/shared/domain/FlowUseCase$invoke$1;->(Lkotlin/coroutines/Continuation;I)V PLcom/google/samples/apps/iosched/shared/domain/FlowUseCase$invoke$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLcom/google/samples/apps/iosched/shared/domain/FlowUseCase$invoke$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLcom/google/samples/apps/iosched/shared/domain/UseCase$invoke$1;->(Lcom/google/samples/apps/iosched/shared/domain/UseCase;Lkotlin/coroutines/Continuation;)V PLcom/google/samples/apps/iosched/shared/domain/UseCase$invoke$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLcom/google/samples/apps/iosched/shared/domain/UseCase$invoke$2;->(Lcom/google/samples/apps/iosched/shared/domain/UseCase;Ljava/lang/Object;Lkotlin/coroutines/Continuation;)V PLcom/google/samples/apps/iosched/shared/domain/UseCase$invoke$2;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; PLcom/google/samples/apps/iosched/shared/domain/UseCase$invoke$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLcom/google/samples/apps/iosched/shared/domain/UseCase;->(Lkotlinx/coroutines/CoroutineDispatcher;I)V PLcom/google/samples/apps/iosched/shared/domain/UseCase;->invoke(Ljava/lang/Object;)Lkotlinx/coroutines/flow/Flow; PLcom/google/samples/apps/iosched/shared/domain/UseCase;->invoke(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLcom/google/samples/apps/iosched/shared/domain/ar/LoadArDebugFlagUseCase;->(Lcom/google/samples/apps/iosched/shared/data/ar/ArDebugFlagEndpoint;Lkotlinx/coroutines/CoroutineDispatcher;)V PLcom/google/samples/apps/iosched/shared/domain/ar/LoadArDebugFlagUseCase;->execute(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLcom/google/samples/apps/iosched/shared/domain/auth/ObserveUserAuthStateUseCase$authStateChanges$1;->(Lcom/google/samples/apps/iosched/shared/domain/auth/ObserveUserAuthStateUseCase;Lkotlin/coroutines/Continuation;)V PLcom/google/samples/apps/iosched/shared/domain/auth/ObserveUserAuthStateUseCase$authStateChanges$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLcom/google/samples/apps/iosched/shared/domain/auth/ObserveUserAuthStateUseCase$authStateChanges$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLcom/google/samples/apps/iosched/shared/domain/auth/ObserveUserAuthStateUseCase$userSignedIn$2;->(Lcom/google/samples/apps/iosched/shared/domain/auth/ObserveUserAuthStateUseCase;Ljava/lang/String;Lcom/google/samples/apps/iosched/shared/data/signin/AuthenticatedUserInfo;Lkotlinx/coroutines/channels/ProducerScope;Lkotlin/coroutines/Continuation;)V PLcom/google/samples/apps/iosched/shared/domain/auth/ObserveUserAuthStateUseCase$userSignedIn$2;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; PLcom/google/samples/apps/iosched/shared/domain/auth/ObserveUserAuthStateUseCase$userSignedIn$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLcom/google/samples/apps/iosched/shared/domain/auth/ObserveUserAuthStateUseCase;->(Lcom/google/samples/apps/iosched/shared/data/signin/datasources/RegisteredUserDataSource;Lcom/google/samples/apps/iosched/shared/data/signin/datasources/AuthStateUserDataSource;Lcom/google/samples/apps/iosched/shared/fcm/StagingTopicSubscriber;Lkotlinx/coroutines/CoroutineScope;Lkotlinx/coroutines/CoroutineDispatcher;)V PLcom/google/samples/apps/iosched/shared/domain/auth/ObserveUserAuthStateUseCase;->execute(Ljava/lang/Object;)Lkotlinx/coroutines/flow/Flow; PLcom/google/samples/apps/iosched/shared/domain/prefs/OnboardingCompletedUseCase;->(Lcom/google/samples/apps/iosched/shared/data/ConferenceDataRepository;Lkotlinx/coroutines/CoroutineDispatcher;)V PLcom/google/samples/apps/iosched/shared/domain/prefs/OnboardingCompletedUseCase;->(Lcom/google/samples/apps/iosched/shared/data/prefs/PreferenceStorage;Lkotlinx/coroutines/CoroutineDispatcher;I)V PLcom/google/samples/apps/iosched/shared/domain/prefs/OnboardingCompletedUseCase;->execute(Ljava/lang/Object;)Lkotlinx/coroutines/flow/Flow; PLcom/google/samples/apps/iosched/shared/domain/prefs/OnboardingCompletedUseCase;->execute(Lkotlin/Unit;)Lkotlinx/coroutines/flow/Flow; PLcom/google/samples/apps/iosched/shared/domain/sessions/LoadPinnedSessionsJsonUseCase$execute$$inlined$map$1$2$1;->(Lkotlinx/coroutines/flow/StartedLazily$command$1$1;Lkotlin/coroutines/Continuation;)V PLcom/google/samples/apps/iosched/shared/domain/sessions/LoadPinnedSessionsJsonUseCase;->(Lcom/google/samples/apps/iosched/shared/data/userevent/DefaultSessionAndUserEventRepository;Lcom/google/gson/Gson;Lkotlinx/coroutines/CoroutineDispatcher;)V PLcom/google/samples/apps/iosched/shared/domain/sessions/LoadPinnedSessionsJsonUseCase;->execute(Ljava/lang/Object;)Lkotlinx/coroutines/flow/Flow; PLcom/google/samples/apps/iosched/shared/domain/sessions/LoadScheduleUserSessionsParameters;->(Ljava/lang/String;Lorg/threeten/bp/ZonedDateTime;I)V PLcom/google/samples/apps/iosched/shared/domain/sessions/LoadScheduleUserSessionsResult;->(Ljava/util/List;Lcom/google/samples/apps/iosched/model/Session;IILandroidx/compose/runtime/SnapshotThreadLocal;)V PLcom/google/samples/apps/iosched/shared/domain/sessions/LoadScheduleUserSessionsUseCase$execute$$inlined$map$1$2$1;->(Lkotlinx/coroutines/flow/DistinctFlowImpl$collect$2;Lkotlin/coroutines/Continuation;)V PLcom/google/samples/apps/iosched/shared/domain/sessions/LoadUserSessionUseCase;->(Lcom/google/samples/apps/iosched/shared/data/userevent/DefaultSessionAndUserEventRepository;Lkotlinx/coroutines/CoroutineDispatcher;I)V PLcom/google/samples/apps/iosched/shared/domain/sessions/LoadUserSessionUseCase;->execute(Ljava/lang/Object;)Lkotlinx/coroutines/flow/Flow; PLcom/google/samples/apps/iosched/shared/domain/sessions/LoadUserSessionUseCase;->findFirstUnfinishedSession(Ljava/util/List;Lorg/threeten/bp/ZonedDateTime;)I PLcom/google/samples/apps/iosched/shared/domain/sessions/NotificationAlarmUpdater$updateAll$1$events$1;->(Lkotlin/coroutines/Continuation;)V PLcom/google/samples/apps/iosched/shared/domain/sessions/NotificationAlarmUpdater$updateAll$1$events$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLcom/google/samples/apps/iosched/shared/domain/sessions/NotificationAlarmUpdater$updateAll$1;->(Lcom/google/samples/apps/iosched/shared/domain/sessions/NotificationAlarmUpdater;Ljava/lang/String;Lkotlin/coroutines/Continuation;)V PLcom/google/samples/apps/iosched/shared/domain/sessions/NotificationAlarmUpdater$updateAll$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; PLcom/google/samples/apps/iosched/shared/domain/sessions/NotificationAlarmUpdater;->(Lcom/google/samples/apps/iosched/shared/notifications/SessionAlarmManager;Lcom/google/samples/apps/iosched/shared/data/userevent/SessionAndUserEventRepository;Lkotlinx/coroutines/CoroutineScope;)V PLcom/google/samples/apps/iosched/shared/domain/sessions/StarReserveNotificationAlarmUpdater;->(Lcom/google/samples/apps/iosched/shared/notifications/SessionAlarmManager;)V PLcom/google/samples/apps/iosched/shared/domain/settings/GetThemeUseCase$execute$1;->(Lcom/google/samples/apps/iosched/shared/domain/settings/GetThemeUseCase;Lkotlin/coroutines/Continuation;)V PLcom/google/samples/apps/iosched/shared/domain/settings/GetThemeUseCase$execute$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLcom/google/samples/apps/iosched/shared/domain/settings/GetThemeUseCase;->(Lcom/google/samples/apps/iosched/shared/data/prefs/PreferenceStorage;Lkotlinx/coroutines/CoroutineDispatcher;I)V PLcom/google/samples/apps/iosched/shared/domain/settings/GetThemeUseCase;->execute(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLcom/google/samples/apps/iosched/shared/domain/settings/GetThemeUseCase;->execute(Lkotlin/Unit;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLcom/google/samples/apps/iosched/shared/domain/settings/GetThemeUseCase;->execute(Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLcom/google/samples/apps/iosched/shared/domain/settings/ObserveThemeModeUseCase$execute$$inlined$map$1$2$1;->(Landroidx/compose/material/SwipeableState$special$$inlined$filter$1$2;Lkotlin/coroutines/Continuation;)V PLcom/google/samples/apps/iosched/shared/domain/speakers/LoadSpeakerUseCase;->(Lcom/google/samples/apps/iosched/shared/data/ConferenceDataRepository;Lkotlinx/coroutines/CoroutineDispatcher;I)V PLcom/google/samples/apps/iosched/shared/domain/users/StarEventAndNotifyUseCase;->(Lcom/google/samples/apps/iosched/shared/data/userevent/SessionAndUserEventRepository;Lcom/google/samples/apps/iosched/shared/domain/sessions/StarReserveNotificationAlarmUpdater;Lkotlinx/coroutines/CoroutineDispatcher;)V PLcom/google/samples/apps/iosched/shared/fcm/StagingTopicSubscriber;->()V PLcom/google/samples/apps/iosched/shared/notifications/SessionAlarmManager;->()V PLcom/google/samples/apps/iosched/shared/notifications/SessionAlarmManager;->(Landroid/content/Context;)V PLcom/google/samples/apps/iosched/shared/notifications/SessionAlarmManager;->setAlarmForSession(Lcom/google/samples/apps/iosched/model/userdata/UserSession;)V PLcom/google/samples/apps/iosched/shared/result/Result$Loading;->()V PLcom/google/samples/apps/iosched/shared/result/Result$Loading;->()V PLcom/google/samples/apps/iosched/shared/result/Result$Success;->(Ljava/lang/Object;)V PLcom/google/samples/apps/iosched/shared/result/Result$Success;->equals(Ljava/lang/Object;)Z PLcom/google/samples/apps/iosched/shared/result/Result;->(Lkotlin/LazyKt__LazyKt;)V PLcom/google/samples/apps/iosched/shared/util/TimeUtils;->()V PLcom/google/samples/apps/iosched/shared/util/TimeUtils;->()V PLcom/google/samples/apps/iosched/shared/util/TimeUtils;->getShortLabelResForDay(Lcom/google/samples/apps/iosched/model/ConferenceDay;Z)I PLcom/google/samples/apps/iosched/ui/DispatchInsetsNavHostFragment$$ExternalSyntheticLambda0;->()V PLcom/google/samples/apps/iosched/ui/DispatchInsetsNavHostFragment$$ExternalSyntheticLambda0;->()V PLcom/google/samples/apps/iosched/ui/DispatchInsetsNavHostFragment$$ExternalSyntheticLambda0;->onApplyWindowInsets(Landroid/view/View;Landroid/view/WindowInsets;)Landroid/view/WindowInsets; PLcom/google/samples/apps/iosched/ui/DispatchInsetsNavHostFragment;->()V PLcom/google/samples/apps/iosched/ui/DispatchInsetsNavHostFragment;->onViewCreated(Landroid/view/View;Landroid/os/Bundle;)V PLcom/google/samples/apps/iosched/ui/Hilt_MainActivity;->(I)V PLcom/google/samples/apps/iosched/ui/Hilt_MainActivity;->componentManager()Ldagger/hilt/android/internal/managers/ActivityComponentManager; PLcom/google/samples/apps/iosched/ui/Hilt_MainActivity;->createComponentManager()Ldagger/hilt/android/internal/managers/ActivityComponentManager; PLcom/google/samples/apps/iosched/ui/Hilt_MainActivity;->generatedComponent()Ljava/lang/Object; PLcom/google/samples/apps/iosched/ui/Hilt_MainActivity;->getDefaultViewModelProviderFactory()Landroidx/lifecycle/ViewModelProvider$Factory; PLcom/google/samples/apps/iosched/ui/Hilt_MainActivity;->inject()V PLcom/google/samples/apps/iosched/ui/MainActivity$$ExternalSyntheticLambda0;->(Ljava/lang/Object;I)V PLcom/google/samples/apps/iosched/ui/MainActivity$$ExternalSyntheticLambda1;->()V PLcom/google/samples/apps/iosched/ui/MainActivity$$ExternalSyntheticLambda1;->(I)V PLcom/google/samples/apps/iosched/ui/MainActivity$onCreate$1;->(Lcom/google/samples/apps/iosched/ui/MainActivity;)V PLcom/google/samples/apps/iosched/ui/MainActivity$onCreate$1;->onDestinationChanged(Landroidx/navigation/NavHostController;Landroidx/navigation/NavDestination;Landroid/os/Bundle;)V PLcom/google/samples/apps/iosched/ui/MainActivity$onCreate$4$1$1$1;->(Lcom/google/samples/apps/iosched/ui/MainActivity;I)V PLcom/google/samples/apps/iosched/ui/MainActivity$onCreate$4$1$1$1;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLcom/google/samples/apps/iosched/ui/MainActivity$onCreate$4$1$1;->(Lcom/google/samples/apps/iosched/ui/MainActivity;Lkotlin/coroutines/Continuation;)V PLcom/google/samples/apps/iosched/ui/MainActivity$onCreate$4$1$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; PLcom/google/samples/apps/iosched/ui/MainActivity$onCreate$4$1$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLcom/google/samples/apps/iosched/ui/MainActivity$onCreate$4$1$2;->(Lcom/google/samples/apps/iosched/ui/MainActivity;Lkotlin/coroutines/Continuation;)V PLcom/google/samples/apps/iosched/ui/MainActivity$onCreate$4$1$2;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; PLcom/google/samples/apps/iosched/ui/MainActivity$onCreate$4$1$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLcom/google/samples/apps/iosched/ui/MainActivity$onCreate$4$1$3$1;->()V PLcom/google/samples/apps/iosched/ui/MainActivity$onCreate$4$1$3$1;->(I)V PLcom/google/samples/apps/iosched/ui/MainActivity$onCreate$4$1$3$1;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLcom/google/samples/apps/iosched/ui/MainActivity$onCreate$4$1$3;->(Lcom/google/samples/apps/iosched/ui/MainActivity;Lkotlin/coroutines/Continuation;)V PLcom/google/samples/apps/iosched/ui/MainActivity$onCreate$4$1$3;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; PLcom/google/samples/apps/iosched/ui/MainActivity$onCreate$4$1$3;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLcom/google/samples/apps/iosched/ui/MainActivity$onCreate$4$1$4;->(Lcom/google/samples/apps/iosched/ui/MainActivity;Lkotlin/coroutines/Continuation;)V PLcom/google/samples/apps/iosched/ui/MainActivity$onCreate$4$1$4;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; PLcom/google/samples/apps/iosched/ui/MainActivity$onCreate$4$1$4;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLcom/google/samples/apps/iosched/ui/MainActivity$onCreate$4$1$5;->(Lcom/google/samples/apps/iosched/ui/MainActivity;Lkotlin/coroutines/Continuation;)V PLcom/google/samples/apps/iosched/ui/MainActivity$onCreate$4$1$5;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; PLcom/google/samples/apps/iosched/ui/MainActivity$onCreate$4$1$5;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLcom/google/samples/apps/iosched/ui/MainActivity$onCreate$4$1;->(Lcom/google/samples/apps/iosched/ui/MainActivity;Lkotlin/coroutines/Continuation;)V PLcom/google/samples/apps/iosched/ui/MainActivity$onCreate$4$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLcom/google/samples/apps/iosched/ui/MainActivity$onCreate$4$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLcom/google/samples/apps/iosched/ui/MainActivity$onCreate$4;->(Lcom/google/samples/apps/iosched/ui/MainActivity;Lkotlin/coroutines/Continuation;)V PLcom/google/samples/apps/iosched/ui/MainActivity$onCreate$4;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; PLcom/google/samples/apps/iosched/ui/MainActivity$onCreate$4;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLcom/google/samples/apps/iosched/ui/MainActivity$special$$inlined$viewModels$default$1;->(Landroidx/activity/ComponentActivity;I)V PLcom/google/samples/apps/iosched/ui/MainActivity$special$$inlined$viewModels$default$1;->invoke()Landroidx/lifecycle/ViewModelProvider$Factory; PLcom/google/samples/apps/iosched/ui/MainActivity$special$$inlined$viewModels$default$1;->invoke()Landroidx/lifecycle/ViewModelStore; PLcom/google/samples/apps/iosched/ui/MainActivity$special$$inlined$viewModels$default$1;->invoke()Ljava/lang/Object; PLcom/google/samples/apps/iosched/ui/MainActivity;->()V PLcom/google/samples/apps/iosched/ui/MainActivity;->()V PLcom/google/samples/apps/iosched/ui/MainActivity;->configureNavMenu(Landroid/view/Menu;)V PLcom/google/samples/apps/iosched/ui/MainActivity;->getViewModel()Lcom/google/samples/apps/iosched/ui/MainActivityViewModel; PLcom/google/samples/apps/iosched/ui/MainActivity;->navigateTo(I)V PLcom/google/samples/apps/iosched/ui/MainActivity;->onCreate(Landroid/os/Bundle;)V PLcom/google/samples/apps/iosched/ui/MainActivity;->onUserInteraction()V PLcom/google/samples/apps/iosched/ui/MainActivityViewModel$arCoreAvailability$1;->(Landroid/content/Context;Lkotlin/coroutines/Continuation;)V PLcom/google/samples/apps/iosched/ui/MainActivityViewModel$arCoreAvailability$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLcom/google/samples/apps/iosched/ui/MainActivityViewModel$arCoreAvailability$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLcom/google/samples/apps/iosched/ui/MainActivityViewModel;->(Lcom/google/samples/apps/iosched/ui/signin/SignInViewModelDelegate;Lcom/google/samples/apps/iosched/ui/theme/ThemedActivityDelegate;Lcom/google/samples/apps/iosched/shared/domain/sessions/LoadPinnedSessionsJsonUseCase;Lcom/google/samples/apps/iosched/shared/domain/ar/LoadArDebugFlagUseCase;Landroid/content/Context;)V PLcom/google/samples/apps/iosched/ui/MainActivityViewModel;->getCurrentTheme()Lcom/google/samples/apps/iosched/model/Theme; PLcom/google/samples/apps/iosched/ui/MainActivityViewModel;->getCurrentUserImageUri()Lkotlinx/coroutines/flow/StateFlow; PLcom/google/samples/apps/iosched/ui/MainActivityViewModel;->getTheme()Lkotlinx/coroutines/flow/StateFlow; PLcom/google/samples/apps/iosched/ui/MainActivityViewModel;->getUserInfo()Lkotlinx/coroutines/flow/StateFlow; PLcom/google/samples/apps/iosched/ui/MainNavigationFragment;->()V PLcom/google/samples/apps/iosched/ui/MainNavigationFragment;->onAttach(Landroid/content/Context;)V PLcom/google/samples/apps/iosched/ui/MainNavigationFragment;->onDetach()V PLcom/google/samples/apps/iosched/ui/MainNavigationFragment;->onViewCreated(Landroid/view/View;Landroid/os/Bundle;)V PLcom/google/samples/apps/iosched/ui/feed/FeedViewModel$feed$1;->(Lcom/google/samples/apps/iosched/ui/schedule/ScheduleViewModel;Lkotlin/coroutines/Continuation;)V PLcom/google/samples/apps/iosched/ui/feed/FeedViewModel$feed$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLcom/google/samples/apps/iosched/ui/feed/FeedViewModel$feed$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLcom/google/samples/apps/iosched/ui/feed/FeedViewModel$sessionContainer$1;->(Landroidx/lifecycle/ViewModel;Lkotlin/coroutines/Continuation;I)V PLcom/google/samples/apps/iosched/ui/feed/FeedViewModel$sessionContainer$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLcom/google/samples/apps/iosched/ui/feed/FeedViewModel$sessionContainer$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLcom/google/samples/apps/iosched/ui/feed/FeedViewModel$special$$inlined$map$2;->(Ljava/lang/Object;Ljava/lang/Object;I)V PLcom/google/samples/apps/iosched/ui/feed/FeedViewModel$special$$inlined$map$2;->collect(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLcom/google/samples/apps/iosched/ui/feed/FeedViewModel_Factory;->provideContext(Landroidx/appcompat/view/ActionBarPolicy;)Landroid/content/Context; PLcom/google/samples/apps/iosched/ui/feed/FeedViewModel_Factory;->providesIoDispatcher()Lkotlinx/coroutines/CoroutineDispatcher; PLcom/google/samples/apps/iosched/ui/feed/FeedViewModel_Factory;->providesMainDispatcher()Lkotlinx/coroutines/CoroutineDispatcher; PLcom/google/samples/apps/iosched/ui/info/Hilt_FaqFragment;->(I)V PLcom/google/samples/apps/iosched/ui/info/Hilt_FaqFragment;->componentManager$com$google$samples$apps$iosched$ui$schedule$Hilt_ScheduleFragment()Ldagger/hilt/android/internal/managers/FragmentComponentManager; PLcom/google/samples/apps/iosched/ui/info/Hilt_FaqFragment;->componentManager()Ldagger/hilt/android/internal/managers/FragmentComponentManager; PLcom/google/samples/apps/iosched/ui/info/Hilt_FaqFragment;->createComponentManager()Ldagger/hilt/android/internal/managers/FragmentComponentManager; PLcom/google/samples/apps/iosched/ui/info/Hilt_FaqFragment;->generatedComponent()Ljava/lang/Object; PLcom/google/samples/apps/iosched/ui/info/Hilt_FaqFragment;->getContext()Landroid/content/Context; PLcom/google/samples/apps/iosched/ui/info/Hilt_FaqFragment;->getDefaultViewModelProviderFactory()Landroidx/lifecycle/ViewModelProvider$Factory; PLcom/google/samples/apps/iosched/ui/info/Hilt_FaqFragment;->initializeComponentContext()V PLcom/google/samples/apps/iosched/ui/info/Hilt_FaqFragment;->inject()V PLcom/google/samples/apps/iosched/ui/info/Hilt_FaqFragment;->onAttach(Landroid/app/Activity;)V PLcom/google/samples/apps/iosched/ui/info/Hilt_FaqFragment;->onAttach(Landroid/content/Context;)V PLcom/google/samples/apps/iosched/ui/info/Hilt_FaqFragment;->onGetLayoutInflater(Landroid/os/Bundle;)Landroid/view/LayoutInflater; PLcom/google/samples/apps/iosched/ui/map/MapFragment$$ExternalSyntheticLambda2;->(Ljava/lang/Object;Ljava/lang/Object;I)V PLcom/google/samples/apps/iosched/ui/map/MapFragment$$ExternalSyntheticLambda2;->run()V PLcom/google/samples/apps/iosched/ui/map/MapFragment$special$$inlined$viewModels$default$3;->(Lkotlin/jvm/functions/Function0;Landroidx/fragment/app/Fragment;I)V PLcom/google/samples/apps/iosched/ui/map/MapFragment$special$$inlined$viewModels$default$3;->invoke()Landroidx/lifecycle/ViewModelProvider$Factory; PLcom/google/samples/apps/iosched/ui/map/MapFragment$special$$inlined$viewModels$default$3;->invoke()Ljava/lang/Object; PLcom/google/samples/apps/iosched/ui/map/MapViewModel$1$1;->(Ljava/lang/Object;I)V PLcom/google/samples/apps/iosched/ui/messages/SnackbarMessageFragmentExtensionsKt$setupSnackbarManager$$inlined$launchAndRepeatWithViewLifecycle$default$1$1;->(Lkotlin/coroutines/Continuation;Lcom/google/samples/apps/iosched/ui/messages/SnackbarMessageManager;Landroidx/fragment/app/Fragment;Lcom/google/samples/apps/iosched/widget/FadingSnackbar;)V PLcom/google/samples/apps/iosched/ui/messages/SnackbarMessageFragmentExtensionsKt$setupSnackbarManager$$inlined$launchAndRepeatWithViewLifecycle$default$1$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLcom/google/samples/apps/iosched/ui/messages/SnackbarMessageFragmentExtensionsKt$setupSnackbarManager$$inlined$launchAndRepeatWithViewLifecycle$default$1$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLcom/google/samples/apps/iosched/ui/messages/SnackbarMessageFragmentExtensionsKt$setupSnackbarManager$$inlined$launchAndRepeatWithViewLifecycle$default$1;->(Landroidx/fragment/app/Fragment;Landroidx/lifecycle/Lifecycle$State;Lkotlin/coroutines/Continuation;Lcom/google/samples/apps/iosched/ui/messages/SnackbarMessageManager;Landroidx/fragment/app/Fragment;Lcom/google/samples/apps/iosched/widget/FadingSnackbar;)V PLcom/google/samples/apps/iosched/ui/messages/SnackbarMessageFragmentExtensionsKt$setupSnackbarManager$$inlined$launchAndRepeatWithViewLifecycle$default$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; PLcom/google/samples/apps/iosched/ui/messages/SnackbarMessageFragmentExtensionsKt$setupSnackbarManager$$inlined$launchAndRepeatWithViewLifecycle$default$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLcom/google/samples/apps/iosched/ui/messages/SnackbarMessageManager;->(Lcom/google/samples/apps/iosched/shared/data/prefs/PreferenceStorage;Lkotlinx/coroutines/CoroutineScope;Lcom/google/samples/apps/iosched/shared/domain/settings/GetThemeUseCase;)V PLcom/google/samples/apps/iosched/ui/reservation/ReservationViewState;->()V PLcom/google/samples/apps/iosched/ui/reservation/ReservationViewState;->(Ljava/lang/String;I[III)V PLcom/google/samples/apps/iosched/ui/schedule/DayIndicator;->(Lcom/google/samples/apps/iosched/model/ConferenceDay;ZZI)V PLcom/google/samples/apps/iosched/ui/schedule/DayIndicator;->equals(Ljava/lang/Object;)Z PLcom/google/samples/apps/iosched/ui/schedule/DayIndicatorAdapter;->(Lcom/google/samples/apps/iosched/ui/schedule/ScheduleViewModel;Landroidx/lifecycle/LifecycleOwner;)V PLcom/google/samples/apps/iosched/ui/schedule/DayIndicatorAdapter;->onBindViewHolder(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;I)V PLcom/google/samples/apps/iosched/ui/schedule/DayIndicatorAdapter;->onCreateViewHolder(Landroid/view/ViewGroup;I)Landroidx/recyclerview/widget/RecyclerView$ViewHolder; PLcom/google/samples/apps/iosched/ui/schedule/DayIndicatorViewHolder;->(Lcom/google/samples/apps/iosched/databinding/ItemScheduleDayIndicatorBinding;Lcom/google/samples/apps/iosched/ui/schedule/ScheduleViewModel;Landroidx/lifecycle/LifecycleOwner;)V PLcom/google/samples/apps/iosched/ui/schedule/Hilt_ScheduleTwoPaneFragment;->()V PLcom/google/samples/apps/iosched/ui/schedule/Hilt_ScheduleTwoPaneFragment;->generatedComponent()Ljava/lang/Object; PLcom/google/samples/apps/iosched/ui/schedule/Hilt_ScheduleTwoPaneFragment;->initializeComponentContext()V PLcom/google/samples/apps/iosched/ui/schedule/Hilt_ScheduleTwoPaneFragment;->inject()V PLcom/google/samples/apps/iosched/ui/schedule/Hilt_ScheduleTwoPaneFragment;->onAttach(Landroid/app/Activity;)V PLcom/google/samples/apps/iosched/ui/schedule/Hilt_ScheduleTwoPaneFragment;->onAttach(Landroid/content/Context;)V PLcom/google/samples/apps/iosched/ui/schedule/Hilt_ScheduleTwoPaneFragment;->onGetLayoutInflater(Landroid/os/Bundle;)Landroid/view/LayoutInflater; PLcom/google/samples/apps/iosched/ui/schedule/IndicatorDiff;->()V PLcom/google/samples/apps/iosched/ui/schedule/IndicatorDiff;->()V PLcom/google/samples/apps/iosched/ui/schedule/IndicatorDiff;->areContentsTheSame(Ljava/lang/Object;Ljava/lang/Object;)Z PLcom/google/samples/apps/iosched/ui/schedule/IndicatorDiff;->areItemsTheSame(Ljava/lang/Object;Ljava/lang/Object;)Z PLcom/google/samples/apps/iosched/ui/schedule/ScheduleFragment$onViewCreated$$inlined$doOnNextLayout$1;->()V PLcom/google/samples/apps/iosched/ui/schedule/ScheduleFragment$onViewCreated$$inlined$doOnNextLayout$1;->onLayoutChange(Landroid/view/View;IIIIIIII)V PLcom/google/samples/apps/iosched/ui/schedule/ScheduleFragment$onViewCreated$$inlined$launchAndRepeatWithViewLifecycle$default$1$1;->(Lkotlin/coroutines/Continuation;Lcom/google/samples/apps/iosched/ui/schedule/ScheduleFragment;)V PLcom/google/samples/apps/iosched/ui/schedule/ScheduleFragment$onViewCreated$$inlined$launchAndRepeatWithViewLifecycle$default$1$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLcom/google/samples/apps/iosched/ui/schedule/ScheduleFragment$onViewCreated$$inlined$launchAndRepeatWithViewLifecycle$default$1$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLcom/google/samples/apps/iosched/ui/schedule/ScheduleFragment$onViewCreated$$inlined$launchAndRepeatWithViewLifecycle$default$1;->(Landroidx/fragment/app/Fragment;Landroidx/lifecycle/Lifecycle$State;Lkotlin/coroutines/Continuation;Lcom/google/samples/apps/iosched/ui/schedule/ScheduleFragment;)V PLcom/google/samples/apps/iosched/ui/schedule/ScheduleFragment$onViewCreated$$inlined$launchAndRepeatWithViewLifecycle$default$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; PLcom/google/samples/apps/iosched/ui/schedule/ScheduleFragment$onViewCreated$$inlined$launchAndRepeatWithViewLifecycle$default$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLcom/google/samples/apps/iosched/ui/schedule/ScheduleFragment$onViewCreated$5$1$1;->(Lcom/google/samples/apps/iosched/ui/schedule/ScheduleFragment;I)V PLcom/google/samples/apps/iosched/ui/schedule/ScheduleFragment$onViewCreated$5$1;->(Lcom/google/samples/apps/iosched/ui/schedule/ScheduleFragment;Lkotlin/coroutines/Continuation;)V PLcom/google/samples/apps/iosched/ui/schedule/ScheduleFragment$onViewCreated$5$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; PLcom/google/samples/apps/iosched/ui/schedule/ScheduleFragment$onViewCreated$5$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLcom/google/samples/apps/iosched/ui/schedule/ScheduleFragment$onViewCreated$5$2;->(Lcom/google/samples/apps/iosched/ui/schedule/ScheduleFragment;Lkotlin/coroutines/Continuation;)V PLcom/google/samples/apps/iosched/ui/schedule/ScheduleFragment$onViewCreated$5$2;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; PLcom/google/samples/apps/iosched/ui/schedule/ScheduleFragment$onViewCreated$5$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLcom/google/samples/apps/iosched/ui/schedule/ScheduleFragment$onViewCreated$5$3;->(Lcom/google/samples/apps/iosched/ui/schedule/ScheduleFragment;Lkotlin/coroutines/Continuation;)V PLcom/google/samples/apps/iosched/ui/schedule/ScheduleFragment$onViewCreated$5$3;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; PLcom/google/samples/apps/iosched/ui/schedule/ScheduleFragment$onViewCreated$5$3;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLcom/google/samples/apps/iosched/ui/schedule/ScheduleFragment$onViewCreated$5$4;->(Lcom/google/samples/apps/iosched/ui/schedule/ScheduleFragment;Lkotlin/coroutines/Continuation;)V PLcom/google/samples/apps/iosched/ui/schedule/ScheduleFragment$onViewCreated$5$4;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; PLcom/google/samples/apps/iosched/ui/schedule/ScheduleFragment$onViewCreated$5$4;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLcom/google/samples/apps/iosched/ui/schedule/ScheduleFragment$onViewCreated$5$5;->(Lcom/google/samples/apps/iosched/ui/schedule/ScheduleFragment;Lkotlin/coroutines/Continuation;)V PLcom/google/samples/apps/iosched/ui/schedule/ScheduleFragment$onViewCreated$5$5;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; PLcom/google/samples/apps/iosched/ui/schedule/ScheduleFragment$onViewCreated$5$5;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLcom/google/samples/apps/iosched/ui/schedule/ScheduleFragment;->()V PLcom/google/samples/apps/iosched/ui/schedule/ScheduleFragment;->getScheduleViewModel()Lcom/google/samples/apps/iosched/ui/schedule/ScheduleViewModel; PLcom/google/samples/apps/iosched/ui/schedule/ScheduleFragment;->onCreateView(Landroid/view/LayoutInflater;Landroid/view/ViewGroup;Landroid/os/Bundle;)Landroid/view/View; PLcom/google/samples/apps/iosched/ui/schedule/ScheduleFragment;->onViewCreated(Landroid/view/View;Landroid/os/Bundle;)V PLcom/google/samples/apps/iosched/ui/schedule/ScheduleFragment;->rebuildDayIndicators()V PLcom/google/samples/apps/iosched/ui/schedule/ScheduleTwoPaneFragment$BackPressHandler;->(Lcom/google/samples/apps/iosched/ui/schedule/ScheduleTwoPaneFragment;)V PLcom/google/samples/apps/iosched/ui/schedule/ScheduleTwoPaneFragment$BackPressHandler;->onDestinationChanged(Landroidx/navigation/NavHostController;Landroidx/navigation/NavDestination;Landroid/os/Bundle;)V PLcom/google/samples/apps/iosched/ui/schedule/ScheduleTwoPaneFragment$BackPressHandler;->syncEnabledState()V PLcom/google/samples/apps/iosched/ui/schedule/ScheduleTwoPaneFragment$onViewCreated$$inlined$launchAndRepeatWithViewLifecycle$default$1$1;->(Lkotlin/coroutines/Continuation;Lcom/google/samples/apps/iosched/ui/schedule/ScheduleTwoPaneFragment;)V PLcom/google/samples/apps/iosched/ui/schedule/ScheduleTwoPaneFragment$onViewCreated$$inlined$launchAndRepeatWithViewLifecycle$default$1$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLcom/google/samples/apps/iosched/ui/schedule/ScheduleTwoPaneFragment$onViewCreated$$inlined$launchAndRepeatWithViewLifecycle$default$1$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLcom/google/samples/apps/iosched/ui/schedule/ScheduleTwoPaneFragment$onViewCreated$$inlined$launchAndRepeatWithViewLifecycle$default$1;->(Landroidx/fragment/app/Fragment;Landroidx/lifecycle/Lifecycle$State;Lkotlin/coroutines/Continuation;Lcom/google/samples/apps/iosched/ui/schedule/ScheduleTwoPaneFragment;)V PLcom/google/samples/apps/iosched/ui/schedule/ScheduleTwoPaneFragment$onViewCreated$$inlined$launchAndRepeatWithViewLifecycle$default$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; PLcom/google/samples/apps/iosched/ui/schedule/ScheduleTwoPaneFragment$onViewCreated$$inlined$launchAndRepeatWithViewLifecycle$default$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLcom/google/samples/apps/iosched/ui/schedule/ScheduleTwoPaneFragment$onViewCreated$4$1$1;->(Lcom/google/samples/apps/iosched/ui/schedule/ScheduleTwoPaneFragment;I)V PLcom/google/samples/apps/iosched/ui/schedule/ScheduleTwoPaneFragment$onViewCreated$4$1;->(Lcom/google/samples/apps/iosched/ui/schedule/ScheduleTwoPaneFragment;Lkotlin/coroutines/Continuation;)V PLcom/google/samples/apps/iosched/ui/schedule/ScheduleTwoPaneFragment$onViewCreated$4$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; PLcom/google/samples/apps/iosched/ui/schedule/ScheduleTwoPaneFragment$onViewCreated$4$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLcom/google/samples/apps/iosched/ui/schedule/ScheduleTwoPaneFragment$onViewCreated$4$2;->(Lcom/google/samples/apps/iosched/ui/schedule/ScheduleTwoPaneFragment;Lkotlin/coroutines/Continuation;)V PLcom/google/samples/apps/iosched/ui/schedule/ScheduleTwoPaneFragment$onViewCreated$4$2;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; PLcom/google/samples/apps/iosched/ui/schedule/ScheduleTwoPaneFragment$onViewCreated$4$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLcom/google/samples/apps/iosched/ui/schedule/ScheduleTwoPaneFragment$onViewCreated$4$3;->(Lcom/google/samples/apps/iosched/ui/schedule/ScheduleTwoPaneFragment;Lkotlin/coroutines/Continuation;)V PLcom/google/samples/apps/iosched/ui/schedule/ScheduleTwoPaneFragment$onViewCreated$4$3;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; PLcom/google/samples/apps/iosched/ui/schedule/ScheduleTwoPaneFragment$onViewCreated$4$3;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLcom/google/samples/apps/iosched/ui/schedule/ScheduleTwoPaneFragment;->()V PLcom/google/samples/apps/iosched/ui/schedule/ScheduleTwoPaneFragment;->access$getScheduleTwoPaneViewModel(Lcom/google/samples/apps/iosched/ui/schedule/ScheduleTwoPaneFragment;)Lcom/google/samples/apps/iosched/ui/schedule/ScheduleTwoPaneViewModel; PLcom/google/samples/apps/iosched/ui/schedule/ScheduleTwoPaneFragment;->onCreateView(Landroid/view/LayoutInflater;Landroid/view/ViewGroup;Landroid/os/Bundle;)Landroid/view/View; PLcom/google/samples/apps/iosched/ui/schedule/ScheduleTwoPaneFragment;->onViewCreated(Landroid/view/View;Landroid/os/Bundle;)V PLcom/google/samples/apps/iosched/ui/schedule/ScheduleTwoPaneViewModel;->(Lcom/google/samples/apps/iosched/ui/sessioncommon/OnSessionStarClickDelegate;)V PLcom/google/samples/apps/iosched/ui/schedule/ScheduleTwoPaneViewModel;->getNavigateToSignInDialogEvents()Lkotlinx/coroutines/flow/Flow; PLcom/google/samples/apps/iosched/ui/schedule/ScheduleUiData;->(Ljava/util/List;Lorg/threeten/bp/ZoneId;Landroidx/compose/runtime/SnapshotThreadLocal;)V PLcom/google/samples/apps/iosched/ui/schedule/ScheduleUiData;->(Ljava/util/List;Lorg/threeten/bp/ZoneId;Landroidx/compose/runtime/SnapshotThreadLocal;I)V PLcom/google/samples/apps/iosched/ui/schedule/ScheduleUiData;->equals(Ljava/lang/Object;)Z PLcom/google/samples/apps/iosched/ui/schedule/ScheduleViewModel$1;->(Lcom/google/samples/apps/iosched/shared/domain/prefs/OnboardingCompletedUseCase;Lcom/google/samples/apps/iosched/ui/schedule/ScheduleViewModel;Lkotlin/coroutines/Continuation;)V PLcom/google/samples/apps/iosched/ui/schedule/ScheduleViewModel$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; PLcom/google/samples/apps/iosched/ui/schedule/ScheduleViewModel$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLcom/google/samples/apps/iosched/ui/schedule/ScheduleViewModel$2;->(Lcom/google/samples/apps/iosched/shared/domain/settings/GetThemeUseCase;Lcom/google/samples/apps/iosched/ui/schedule/ScheduleViewModel;Lkotlin/coroutines/Continuation;)V PLcom/google/samples/apps/iosched/ui/schedule/ScheduleViewModel$2;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; PLcom/google/samples/apps/iosched/ui/schedule/ScheduleViewModel$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLcom/google/samples/apps/iosched/ui/schedule/ScheduleViewModel$isConferenceTimeZone$1;->(Lkotlin/coroutines/Continuation;)V PLcom/google/samples/apps/iosched/ui/schedule/ScheduleViewModel$isConferenceTimeZone$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLcom/google/samples/apps/iosched/ui/schedule/ScheduleViewModel$isLoading$1;->(Lkotlin/coroutines/Continuation;)V PLcom/google/samples/apps/iosched/ui/schedule/ScheduleViewModel$isLoading$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLcom/google/samples/apps/iosched/ui/schedule/ScheduleViewModel$loadDataSignal$1;->(Lcom/google/samples/apps/iosched/ui/schedule/ScheduleViewModel;Lkotlin/coroutines/Continuation;)V PLcom/google/samples/apps/iosched/ui/schedule/ScheduleViewModel$loadDataSignal$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLcom/google/samples/apps/iosched/ui/schedule/ScheduleViewModel$loadDataSignal$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLcom/google/samples/apps/iosched/ui/schedule/ScheduleViewModel$loadSessionsResult$2;->(Lcom/google/samples/apps/iosched/ui/schedule/ScheduleViewModel;Lkotlin/coroutines/Continuation;)V PLcom/google/samples/apps/iosched/ui/schedule/ScheduleViewModel$loadSessionsResult$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLcom/google/samples/apps/iosched/ui/schedule/ScheduleViewModel$loadSessionsResult$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLcom/google/samples/apps/iosched/ui/schedule/ScheduleViewModel$scrollToEvent$1;->(Lcom/google/samples/apps/iosched/ui/schedule/ScheduleViewModel;Lkotlin/coroutines/Continuation;)V PLcom/google/samples/apps/iosched/ui/schedule/ScheduleViewModel$timeZoneId$1;->(Lcom/google/samples/apps/iosched/shared/domain/settings/GetThemeUseCase;Lkotlin/coroutines/Continuation;)V PLcom/google/samples/apps/iosched/ui/schedule/ScheduleViewModel$timeZoneId$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLcom/google/samples/apps/iosched/ui/schedule/ScheduleViewModel$timeZoneId$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLcom/google/samples/apps/iosched/ui/schedule/ScheduleViewModel;->(Lcom/google/samples/apps/iosched/shared/domain/sessions/LoadUserSessionUseCase;Lcom/google/samples/apps/iosched/ui/signin/SignInViewModelDelegate;Lcom/google/samples/apps/iosched/shared/domain/settings/GetThemeUseCase;Lcom/google/samples/apps/iosched/shared/fcm/StagingTopicSubscriber;Lcom/google/samples/apps/iosched/ui/messages/SnackbarMessageManager;Lcom/google/samples/apps/iosched/shared/domain/settings/GetThemeUseCase;Lcom/google/samples/apps/iosched/shared/domain/speakers/LoadSpeakerUseCase;Lcom/google/samples/apps/iosched/shared/domain/prefs/OnboardingCompletedUseCase;)V PLcom/google/samples/apps/iosched/ui/schedule/ScheduleViewModel;->getShowReservations()Lkotlinx/coroutines/flow/StateFlow; PLcom/google/samples/apps/iosched/ui/schedule/ScheduleViewModel;->getSignInNavigationActions()Lkotlinx/coroutines/flow/Flow; PLcom/google/samples/apps/iosched/ui/schedule/ScheduleViewModel;->getUserId()Lkotlinx/coroutines/flow/Flow; PLcom/google/samples/apps/iosched/ui/search/SearchFragment$special$$inlined$viewModels$default$1;->(Landroidx/fragment/app/Fragment;I)V PLcom/google/samples/apps/iosched/ui/search/SearchFragment$special$$inlined$viewModels$default$1;->invoke()Landroidx/fragment/app/Fragment; PLcom/google/samples/apps/iosched/ui/search/SearchFragment$special$$inlined$viewModels$default$1;->invoke()Landroidx/lifecycle/ViewModelProvider$Factory; PLcom/google/samples/apps/iosched/ui/search/SearchFragment$special$$inlined$viewModels$default$1;->invoke()Landroidx/lifecycle/ViewModelStore; PLcom/google/samples/apps/iosched/ui/search/SearchFragment$special$$inlined$viewModels$default$1;->invoke()Ljava/lang/Object; PLcom/google/samples/apps/iosched/ui/sessioncommon/DefaultOnSessionStarClickDelegate;->(Lcom/google/samples/apps/iosched/ui/signin/SignInViewModelDelegate;Lcom/google/samples/apps/iosched/shared/domain/users/StarEventAndNotifyUseCase;Lcom/google/samples/apps/iosched/ui/messages/SnackbarMessageManager;Lcom/google/samples/apps/iosched/shared/analytics/AnalyticsHelper;Lkotlinx/coroutines/CoroutineScope;Lkotlinx/coroutines/CoroutineDispatcher;)V PLcom/google/samples/apps/iosched/ui/sessioncommon/DefaultOnSessionStarClickDelegate;->getNavigateToSignInDialogEvents()Lkotlinx/coroutines/flow/Flow; PLcom/google/samples/apps/iosched/ui/sessioncommon/SessionDiff;->()V PLcom/google/samples/apps/iosched/ui/sessioncommon/SessionDiff;->()V PLcom/google/samples/apps/iosched/ui/sessioncommon/SessionDiff;->areContentsTheSame(Ljava/lang/Object;Ljava/lang/Object;)Z PLcom/google/samples/apps/iosched/ui/sessioncommon/SessionViewHolder;->(Lcom/google/samples/apps/iosched/databinding/ItemSessionBinding;)V PLcom/google/samples/apps/iosched/ui/sessioncommon/SessionsAdapter;->(Landroidx/recyclerview/widget/RecyclerView$RecycledViewPool;Lkotlinx/coroutines/flow/StateFlow;Lkotlinx/coroutines/flow/StateFlow;Landroidx/lifecycle/LifecycleOwner;Lcom/google/samples/apps/iosched/ui/sessioncommon/OnSessionClickListener;Lcom/google/samples/apps/iosched/ui/sessioncommon/OnSessionStarClickListener;)V PLcom/google/samples/apps/iosched/ui/sessioncommon/TagAdapter;->()V PLcom/google/samples/apps/iosched/ui/sessioncommon/TagViewHolder;->(Lcom/google/samples/apps/iosched/databinding/ItemInlineTagBinding;)V PLcom/google/samples/apps/iosched/ui/signin/FirebaseSignInViewModelDelegate$1$1$emit$1;->(Lcom/google/samples/apps/iosched/ui/signin/FirebaseSignInViewModelDelegate$1$1;Lkotlin/coroutines/Continuation;)V PLcom/google/samples/apps/iosched/ui/signin/FirebaseSignInViewModelDelegate$1$1$emit$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLcom/google/samples/apps/iosched/ui/signin/FirebaseSignInViewModelDelegate$1$1;->(Lcom/google/samples/apps/iosched/ui/signin/FirebaseSignInViewModelDelegate;)V PLcom/google/samples/apps/iosched/ui/signin/FirebaseSignInViewModelDelegate$1$1;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLcom/google/samples/apps/iosched/ui/signin/FirebaseSignInViewModelDelegate$1$1;->emit(Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLcom/google/samples/apps/iosched/ui/signin/FirebaseSignInViewModelDelegate$1;->(Lcom/google/samples/apps/iosched/ui/signin/FirebaseSignInViewModelDelegate;Lkotlin/coroutines/Continuation;)V PLcom/google/samples/apps/iosched/ui/signin/FirebaseSignInViewModelDelegate$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; PLcom/google/samples/apps/iosched/ui/signin/FirebaseSignInViewModelDelegate$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLcom/google/samples/apps/iosched/ui/signin/FirebaseSignInViewModelDelegate$special$$inlined$map$1$2$1;->(Lcom/google/samples/apps/iosched/ui/speaker/SpeakerViewModel$speakerUserSessions$1$1$1;Lkotlin/coroutines/Continuation;)V PLcom/google/samples/apps/iosched/ui/signin/FirebaseSignInViewModelDelegate$special$$inlined$map$2$2$1;->(Lcom/google/samples/apps/iosched/ui/speaker/SpeakerViewModel$speakerUserSessions$1$1$1;Lkotlin/coroutines/Continuation;)V PLcom/google/samples/apps/iosched/ui/signin/FirebaseSignInViewModelDelegate$special$$inlined$map$3$2$1;->(Lcom/google/samples/apps/iosched/ui/speaker/SpeakerViewModel$speakerUserSessions$1$1$1;Lkotlin/coroutines/Continuation;)V PLcom/google/samples/apps/iosched/ui/signin/FirebaseSignInViewModelDelegate$special$$inlined$map$4$2$1;->(Lcom/google/samples/apps/iosched/ui/speaker/SpeakerViewModel$speakerUserSessions$1$1$1;Lkotlin/coroutines/Continuation;)V PLcom/google/samples/apps/iosched/ui/signin/FirebaseSignInViewModelDelegate$special$$inlined$map$5$2$1;->(Lcom/google/samples/apps/iosched/ui/speaker/SpeakerViewModel$speakerUserSessions$1$1$1;Lkotlin/coroutines/Continuation;)V PLcom/google/samples/apps/iosched/ui/signin/FirebaseSignInViewModelDelegate$special$$inlined$map$6$2$1;->(Lkotlinx/coroutines/flow/StartedLazily$command$1$1;Lkotlin/coroutines/Continuation;)V PLcom/google/samples/apps/iosched/ui/signin/FirebaseSignInViewModelDelegate$userId$1;->(Lkotlin/coroutines/Continuation;)V PLcom/google/samples/apps/iosched/ui/signin/FirebaseSignInViewModelDelegate$userId$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLcom/google/samples/apps/iosched/ui/signin/FirebaseSignInViewModelDelegate;->(Lcom/google/samples/apps/iosched/shared/domain/auth/ObserveUserAuthStateUseCase;Lcom/google/samples/apps/iosched/shared/domain/settings/GetThemeUseCase;Lkotlinx/coroutines/CoroutineDispatcher;Lkotlinx/coroutines/CoroutineDispatcher;ZLkotlinx/coroutines/CoroutineScope;)V PLcom/google/samples/apps/iosched/ui/signin/FirebaseSignInViewModelDelegate;->getCurrentUserImageUri()Lkotlinx/coroutines/flow/StateFlow; PLcom/google/samples/apps/iosched/ui/signin/FirebaseSignInViewModelDelegate;->getShowReservations()Lkotlinx/coroutines/flow/StateFlow; PLcom/google/samples/apps/iosched/ui/signin/FirebaseSignInViewModelDelegate;->getSignInNavigationActions()Lkotlinx/coroutines/flow/Flow; PLcom/google/samples/apps/iosched/ui/signin/FirebaseSignInViewModelDelegate;->getUserId()Lkotlinx/coroutines/flow/Flow; PLcom/google/samples/apps/iosched/ui/signin/FirebaseSignInViewModelDelegate;->getUserInfo()Lkotlinx/coroutines/flow/StateFlow; PLcom/google/samples/apps/iosched/ui/signin/FirebaseSignInViewModelDelegate;->isUserRegistered()Lkotlinx/coroutines/flow/StateFlow; PLcom/google/samples/apps/iosched/ui/signin/FirebaseSignInViewModelDelegate;->isUserSignedIn()Lkotlinx/coroutines/flow/StateFlow; PLcom/google/samples/apps/iosched/ui/signin/SignInViewExtensionsKt$setupProfileMenuItem$2$1;->(Lcom/google/samples/apps/iosched/ui/MainActivityViewModel;Landroid/view/MenuItem;Landroidx/appcompat/widget/Toolbar;Lkotlin/coroutines/Continuation;)V PLcom/google/samples/apps/iosched/ui/signin/SignInViewExtensionsKt$setupProfileMenuItem$2$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLcom/google/samples/apps/iosched/ui/signin/SignInViewExtensionsKt$setupProfileMenuItem$2$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLcom/google/samples/apps/iosched/ui/signin/SignInViewExtensionsKt$setupProfileMenuItem$2;->(Landroidx/lifecycle/LifecycleOwner;Lcom/google/samples/apps/iosched/ui/MainActivityViewModel;Landroid/view/MenuItem;Landroidx/appcompat/widget/Toolbar;Lkotlin/coroutines/Continuation;)V PLcom/google/samples/apps/iosched/ui/signin/SignInViewExtensionsKt$setupProfileMenuItem$2;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; PLcom/google/samples/apps/iosched/ui/signin/SignInViewExtensionsKt$setupProfileMenuItem$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLcom/google/samples/apps/iosched/ui/signin/SignInViewExtensionsKt$setupProfileMenuItem$3$1;->(Lcom/google/samples/apps/iosched/ui/MainActivityViewModel;Landroidx/appcompat/widget/Toolbar;Lcom/bumptech/glide/request/target/BaseTarget;Lkotlin/coroutines/Continuation;)V PLcom/google/samples/apps/iosched/ui/signin/SignInViewExtensionsKt$setupProfileMenuItem$3$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLcom/google/samples/apps/iosched/ui/signin/SignInViewExtensionsKt$setupProfileMenuItem$3$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLcom/google/samples/apps/iosched/ui/signin/SignInViewExtensionsKt$setupProfileMenuItem$3;->(Landroidx/lifecycle/LifecycleOwner;Lcom/google/samples/apps/iosched/ui/MainActivityViewModel;Landroidx/appcompat/widget/Toolbar;Lcom/bumptech/glide/request/target/BaseTarget;Lkotlin/coroutines/Continuation;)V PLcom/google/samples/apps/iosched/ui/signin/SignInViewExtensionsKt$setupProfileMenuItem$3;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; PLcom/google/samples/apps/iosched/ui/signin/SignInViewExtensionsKt$setupProfileMenuItem$3;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLcom/google/samples/apps/iosched/ui/speaker/SpeakerViewModel$speakerUserSessions$1$1$1;->(Lkotlinx/coroutines/flow/FlowCollector;I)V PLcom/google/samples/apps/iosched/ui/speaker/SpeakerViewModel$speakerUserSessions$1$1$1;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLcom/google/samples/apps/iosched/ui/theme/ThemedActivityDelegateImpl$currentTheme$1;->(Lcom/google/samples/apps/iosched/ui/theme/ThemedActivityDelegateImpl;Lkotlin/coroutines/Continuation;)V PLcom/google/samples/apps/iosched/ui/theme/ThemedActivityDelegateImpl$currentTheme$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; PLcom/google/samples/apps/iosched/ui/theme/ThemedActivityDelegateImpl$currentTheme$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLcom/google/samples/apps/iosched/ui/theme/ThemedActivityDelegateImpl$special$$inlined$map$1$2$1;->(Lcom/google/samples/apps/iosched/ui/speaker/SpeakerViewModel$speakerUserSessions$1$1$1;Lkotlin/coroutines/Continuation;)V PLcom/google/samples/apps/iosched/ui/theme/ThemedActivityDelegateImpl$special$$inlined$map$1;->(Lkotlinx/coroutines/flow/Flow;I)V PLcom/google/samples/apps/iosched/ui/theme/ThemedActivityDelegateImpl$special$$inlined$map$1;->collect(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLcom/google/samples/apps/iosched/ui/theme/ThemedActivityDelegateImpl;->(Lkotlinx/coroutines/CoroutineScope;Lcom/google/samples/apps/iosched/shared/domain/prefs/OnboardingCompletedUseCase;Lcom/google/samples/apps/iosched/shared/domain/settings/GetThemeUseCase;)V PLcom/google/samples/apps/iosched/ui/theme/ThemedActivityDelegateImpl;->getCurrentTheme()Lcom/google/samples/apps/iosched/model/Theme; PLcom/google/samples/apps/iosched/ui/theme/ThemedActivityDelegateImpl;->getTheme()Lkotlinx/coroutines/flow/StateFlow; PLcom/google/samples/apps/iosched/util/CrashlyticsTree;->()V PLcom/google/samples/apps/iosched/util/CrashlyticsTree;->log(ILjava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)V PLcom/google/samples/apps/iosched/util/ExtensionsKt$$ExternalSyntheticLambda0;->(Ljava/lang/Object;Ljava/lang/Object;)V PLcom/google/samples/apps/iosched/util/ExtensionsKt$$ExternalSyntheticLambda0;->onApplyWindowInsets(Landroid/view/View;Landroidx/core/view/WindowInsetsCompat;)Landroidx/core/view/WindowInsetsCompat; PLcom/google/samples/apps/iosched/util/ExtensionsKt$WhenMappings;->()V PLcom/google/samples/apps/iosched/util/FirebaseAnalyticsHelper$1$1;->(Lcom/google/samples/apps/iosched/util/FirebaseAnalyticsHelper;I)V PLcom/google/samples/apps/iosched/util/FirebaseAnalyticsHelper$1$1;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLcom/google/samples/apps/iosched/util/FirebaseAnalyticsHelper$1$1;->emit(Z)Ljava/lang/Object; PLcom/google/samples/apps/iosched/util/FirebaseAnalyticsHelper$1;->(Lcom/google/samples/apps/iosched/util/FirebaseAnalyticsHelper;Lkotlin/coroutines/Continuation;)V PLcom/google/samples/apps/iosched/util/FirebaseAnalyticsHelper$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; PLcom/google/samples/apps/iosched/util/FirebaseAnalyticsHelper$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLcom/google/samples/apps/iosched/util/FirebaseAnalyticsHelper$2;->(Lcom/google/samples/apps/iosched/util/FirebaseAnalyticsHelper;Lkotlin/coroutines/Continuation;)V PLcom/google/samples/apps/iosched/util/FirebaseAnalyticsHelper$2;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; PLcom/google/samples/apps/iosched/util/FirebaseAnalyticsHelper$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLcom/google/samples/apps/iosched/util/FirebaseAnalyticsHelper$3;->(Lcom/google/samples/apps/iosched/ui/signin/SignInViewModelDelegate;Lcom/google/samples/apps/iosched/util/FirebaseAnalyticsHelper;Lkotlin/coroutines/Continuation;)V PLcom/google/samples/apps/iosched/util/FirebaseAnalyticsHelper$3;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; PLcom/google/samples/apps/iosched/util/FirebaseAnalyticsHelper$3;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLcom/google/samples/apps/iosched/util/FirebaseAnalyticsHelper$4;->(Lcom/google/samples/apps/iosched/ui/signin/SignInViewModelDelegate;Lcom/google/samples/apps/iosched/util/FirebaseAnalyticsHelper;Lkotlin/coroutines/Continuation;)V PLcom/google/samples/apps/iosched/util/FirebaseAnalyticsHelper$4;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; PLcom/google/samples/apps/iosched/util/FirebaseAnalyticsHelper$4;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLcom/google/samples/apps/iosched/util/FirebaseAnalyticsHelper$logSendUsageStatsFlagChanges$$inlined$map$1$2$1;->(Lcom/google/samples/apps/iosched/ui/speaker/SpeakerViewModel$speakerUserSessions$1$1$1;Lkotlin/coroutines/Continuation;)V PLcom/google/samples/apps/iosched/util/FirebaseAnalyticsHelper$logSendUsageStatsFlagChanges$$inlined$map$2$2$1;->(Lcom/google/samples/apps/iosched/ui/speaker/SpeakerViewModel$speakerUserSessions$1$1$1;Lkotlin/coroutines/Continuation;)V PLcom/google/samples/apps/iosched/util/FirebaseAnalyticsHelper$logSendUsageStatsFlagChanges$$inlined$map$3$2$1;->(Lcom/google/samples/apps/iosched/ui/speaker/SpeakerViewModel$speakerUserSessions$1$1$1;Lkotlin/coroutines/Continuation;)V PLcom/google/samples/apps/iosched/util/FirebaseAnalyticsHelper$logSendUsageStatsFlagChanges$$inlined$map$4$2$1;->(Lcom/google/samples/apps/iosched/ui/speaker/SpeakerViewModel$speakerUserSessions$1$1$1;Lkotlin/coroutines/Continuation;)V PLcom/google/samples/apps/iosched/util/FirebaseAnalyticsHelper$logSendUsageStatsFlagChanges$$inlined$map$5$2$1;->(Lcom/google/samples/apps/iosched/ui/speaker/SpeakerViewModel$speakerUserSessions$1$1$1;Lkotlin/coroutines/Continuation;)V PLcom/google/samples/apps/iosched/util/FirebaseAnalyticsHelper$logSendUsageStatsFlagChanges$$inlined$map$6$2$1;->(Lcom/google/samples/apps/iosched/ui/speaker/SpeakerViewModel$speakerUserSessions$1$1$1;Lkotlin/coroutines/Continuation;)V PLcom/google/samples/apps/iosched/util/FirebaseAnalyticsHelper$logSendUsageStatsFlagChanges$$inlined$map$7$2$1;->(Lcom/google/samples/apps/iosched/ui/speaker/SpeakerViewModel$speakerUserSessions$1$1$1;Lkotlin/coroutines/Continuation;)V PLcom/google/samples/apps/iosched/util/FirebaseAnalyticsHelper;->(Lkotlinx/coroutines/CoroutineScope;Lcom/google/samples/apps/iosched/ui/signin/SignInViewModelDelegate;Lcom/google/samples/apps/iosched/shared/data/prefs/PreferenceStorage;)V PLcom/google/samples/apps/iosched/util/FirebaseAnalyticsHelper;->access$logSendUsageStatsFlagChanges(Lcom/google/samples/apps/iosched/util/FirebaseAnalyticsHelper;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLcom/google/samples/apps/iosched/util/FirebaseAnalyticsHelper;->logUiEvent(Ljava/lang/String;Ljava/lang/String;)V PLcom/google/samples/apps/iosched/util/FirebaseAnalyticsHelper;->sendScreenView(Ljava/lang/String;Landroid/app/Activity;)V PLcom/google/samples/apps/iosched/util/GlideTargetsKt$asGlideTarget$1;->(ILandroid/view/MenuItem;)V PLcom/google/samples/apps/iosched/util/GlideTargetsKt$asGlideTarget$1;->getSize(Lcom/bumptech/glide/request/target/SizeReadyCallback;)V PLcom/google/samples/apps/iosched/util/GlideTargetsKt$asGlideTarget$1;->onLoadCleared(Landroid/graphics/drawable/Drawable;)V PLcom/google/samples/apps/iosched/util/GlideTargetsKt$asGlideTarget$1;->onLoadStarted(Landroid/graphics/drawable/Drawable;)V PLcom/google/samples/apps/iosched/util/GlideTargetsKt$asGlideTarget$1;->onResourceReady(Ljava/lang/Object;Lcom/bumptech/glide/request/transition/Transition;)V PLcom/google/samples/apps/iosched/util/GlideTargetsKt$asGlideTarget$1;->removeCallback(Lcom/bumptech/glide/request/target/SizeReadyCallback;)V PLcom/google/samples/apps/iosched/util/HeightTopWindowInsetsListener;->()V PLcom/google/samples/apps/iosched/util/HeightTopWindowInsetsListener;->()V PLcom/google/samples/apps/iosched/util/HeightTopWindowInsetsListener;->onApplyWindowInsets(Landroid/view/View;Landroid/view/WindowInsets;)Landroid/view/WindowInsets; PLcom/google/samples/apps/iosched/util/NoopWindowInsetsListener;->()V PLcom/google/samples/apps/iosched/util/NoopWindowInsetsListener;->()V PLcom/google/samples/apps/iosched/util/NoopWindowInsetsListener;->onApplyWindowInsets(Landroid/view/View;Landroid/view/WindowInsets;)Landroid/view/WindowInsets; PLcom/google/samples/apps/iosched/util/SharingStartedViewsKt;->()V PLcom/google/samples/apps/iosched/util/StatusBarScrimBehavior;->(Landroid/content/Context;Landroid/util/AttributeSet;)V PLcom/google/samples/apps/iosched/util/StatusBarScrimBehavior;->onApplyWindowInsets(Landroidx/coordinatorlayout/widget/CoordinatorLayout;Landroid/view/View;Landroidx/core/view/WindowInsetsCompat;)Landroidx/core/view/WindowInsetsCompat; PLcom/google/samples/apps/iosched/util/StatusBarScrimBehavior;->onDependentViewChanged(Landroidx/coordinatorlayout/widget/CoordinatorLayout;Landroid/view/View;Landroid/view/View;)Z PLcom/google/samples/apps/iosched/util/ViewPaddingState;->(IIIIII)V PLcom/google/samples/apps/iosched/util/initializers/AndroidThreeTenInitializer;->()V PLcom/google/samples/apps/iosched/util/initializers/AndroidThreeTenInitializer;->create(Landroid/content/Context;)Ljava/lang/Object; PLcom/google/samples/apps/iosched/util/initializers/AndroidThreeTenInitializer;->dependencies()Ljava/util/List; PLcom/google/samples/apps/iosched/util/initializers/StrictModeInitializer;->()V PLcom/google/samples/apps/iosched/util/initializers/StrictModeInitializer;->create(Landroid/content/Context;)Ljava/lang/Object; PLcom/google/samples/apps/iosched/util/initializers/StrictModeInitializer;->dependencies()Ljava/util/List; PLcom/google/samples/apps/iosched/util/initializers/TimberInitializer;->()V PLcom/google/samples/apps/iosched/util/initializers/TimberInitializer;->create(Landroid/content/Context;)Ljava/lang/Object; PLcom/google/samples/apps/iosched/util/initializers/TimberInitializer;->dependencies()Ljava/util/List; PLcom/google/samples/apps/iosched/widget/BubbleDecoration$$ExternalSyntheticLambda0;->(Lcom/google/samples/apps/iosched/widget/BubbleDecoration;Landroid/animation/ValueAnimator;Landroidx/recyclerview/widget/RecyclerView;)V PLcom/google/samples/apps/iosched/widget/BubbleDecoration;->(Landroid/content/Context;)V PLcom/google/samples/apps/iosched/widget/CountdownView$1;->(Landroidx/slidingpanelayout/widget/SlidingPaneLayout;)V PLcom/google/samples/apps/iosched/widget/CustomSwipeRefreshLayout;->(Landroid/content/Context;Landroid/util/AttributeSet;)V PLcom/google/samples/apps/iosched/widget/CustomSwipeRefreshLayout;->onInterceptTouchEvent(Landroid/view/MotionEvent;)Z PLcom/google/samples/apps/iosched/widget/FadingSnackbar;->(Landroid/content/Context;Landroid/util/AttributeSet;)V PLcom/google/samples/apps/iosched/widget/IoSlidingPaneLayout;->(Landroid/content/Context;Landroid/util/AttributeSet;)V PLcom/google/samples/apps/iosched/widget/JumpSmoothScroller;->(Landroid/content/Context;II)V PLcom/google/samples/apps/iosched/widget/NoTouchRecyclerView;->(Landroid/content/Context;Landroid/util/AttributeSet;)V PLcom/jakewharton/threetenabp/AndroidThreeTen;->()V PLdagger/hilt/android/internal/lifecycle/HiltViewModelFactory$1;->(Ldagger/hilt/android/internal/lifecycle/HiltViewModelFactory;Landroidx/savedstate/SavedStateRegistryOwner;Landroid/os/Bundle;Ldagger/hilt/android/internal/builders/ViewModelComponentBuilder;)V PLdagger/hilt/android/internal/lifecycle/HiltViewModelFactory;->(Landroidx/savedstate/SavedStateRegistryOwner;Landroid/os/Bundle;Ljava/util/Set;Landroidx/lifecycle/ViewModelProvider$Factory;Ldagger/hilt/android/internal/builders/ViewModelComponentBuilder;)V PLdagger/hilt/android/internal/lifecycle/HiltViewModelFactory;->create(Ljava/lang/Class;)Landroidx/lifecycle/ViewModel; PLdagger/hilt/android/internal/managers/ActivityComponentManager;->(Landroid/app/Activity;)V PLdagger/hilt/android/internal/managers/ActivityComponentManager;->createComponent()Ljava/lang/Object; PLdagger/hilt/android/internal/managers/ActivityComponentManager;->generatedComponent()Ljava/lang/Object; PLdagger/hilt/android/internal/managers/ActivityRetainedComponentManager$1;->(Ldagger/hilt/android/internal/managers/FragmentComponentManager;Landroid/content/Context;)V PLdagger/hilt/android/internal/managers/ActivityRetainedComponentManager$1;->create(Ljava/lang/Class;)Landroidx/lifecycle/ViewModel; PLdagger/hilt/android/internal/managers/ActivityRetainedComponentManager$ActivityRetainedComponentViewModel;->(Ldagger/hilt/android/components/ActivityRetainedComponent;)V PLdagger/hilt/android/internal/managers/ActivityRetainedComponentManager$ActivityRetainedComponentViewModel;->onCleared()V PLdagger/hilt/android/internal/managers/ActivityRetainedComponentManager$Lifecycle;->()V PLdagger/hilt/android/internal/managers/FragmentComponentManager;->(Landroidx/activity/ComponentActivity;)V PLdagger/hilt/android/internal/managers/FragmentComponentManager;->(Landroidx/fragment/app/Fragment;)V PLdagger/hilt/android/internal/managers/FragmentComponentManager;->(Lcom/google/firebase/iid/zzz;)V PLdagger/hilt/android/internal/managers/FragmentComponentManager;->createComponent()Ldagger/hilt/android/components/ActivityRetainedComponent; PLdagger/hilt/android/internal/managers/FragmentComponentManager;->createComponent()Ljava/lang/Object; PLdagger/hilt/android/internal/managers/FragmentComponentManager;->generatedComponent()Ljava/lang/Object; PLdagger/hilt/android/internal/managers/FragmentComponentManager;->getViewModelProvider(Landroidx/lifecycle/ViewModelStoreOwner;Landroid/content/Context;)Landroidx/lifecycle/ViewModelProvider; PLdagger/hilt/android/internal/managers/ViewComponentManager$FragmentContextWrapper$1;->(Ldagger/hilt/android/internal/managers/ViewComponentManager$FragmentContextWrapper;)V PLdagger/hilt/android/internal/managers/ViewComponentManager$FragmentContextWrapper$1;->onStateChanged(Landroidx/lifecycle/LifecycleOwner;Landroidx/lifecycle/Lifecycle$Event;)V PLdagger/hilt/android/internal/managers/ViewComponentManager$FragmentContextWrapper;->(Landroid/content/Context;Landroidx/fragment/app/Fragment;)V PLdagger/hilt/android/internal/managers/ViewComponentManager$FragmentContextWrapper;->(Landroid/view/LayoutInflater;Landroidx/fragment/app/Fragment;)V PLdagger/internal/DoubleCheck;->()V PLdagger/internal/DoubleCheck;->(Ljavax/inject/Provider;)V PLdagger/internal/DoubleCheck;->reentrantCheck(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLdagger/internal/InstanceFactory;->(Ljava/lang/Object;)V PLdagger/internal/InstanceFactory;->get()Ljava/lang/Object; PLio/grpc/Attributes$Key;->(Ljava/lang/Object;I)V PLio/grpc/Attributes$Key;->getLogFileDir()Ljava/io/File; PLio/grpc/Attributes$Key;->then(Lcom/google/android/gms/tasks/Task;)Ljava/lang/Object; PLio/grpc/CallOptions$Key;->(ILandroidx/appcompat/R$id$$IA$1;)V PLio/grpc/CallOptions$Key;->(ILandroidx/appcompat/R$id$$IA$2;)V PLio/grpc/CallOptions$Key;->(Ljava/lang/Object;Ljava/lang/Object;I)V PLio/grpc/CallOptions$Key;->(Ljava/lang/Object;Ljava/lang/Object;ILandroidx/appcompat/R$id$$IA$1;)V PLio/grpc/CallOptions$Key;->notifyEventReceivers(Ljava/lang/String;Landroid/os/Bundle;)V PLio/grpc/CallOptions$Key;->onApplyWindowInsets(Landroid/view/View;Landroidx/core/view/WindowInsetsCompat;)Landroidx/core/view/WindowInsetsCompat; PLio/grpc/CallOptions$Key;->onDecodeComplete(Lcom/bumptech/glide/load/engine/bitmap_recycle/BitmapPool;Landroid/graphics/Bitmap;)V PLio/grpc/CallOptions$Key;->onMessageTriggered(ILandroid/os/Bundle;)V PLio/grpc/CallOptions$Key;->onObtainBounds()V PLio/grpc/CallOptions$Key;->zza()V PLio/grpc/CallOptions$Key;->zza(Landroid/content/Context;)Lio/grpc/CallOptions$Key; PLio/grpc/CallOptions$Key;->zzc(Ljava/lang/String;)Ljava/lang/String; PLio/grpc/Metadata$1;->(I)V PLio/grpc/Metadata$1;->(Lkotlin/LazyKt__LazyKt;I)V PLio/grpc/Metadata$2;->()V PLio/grpc/Metadata$2;->()V PLio/grpc/Metadata$2;->(Ljava/lang/Object;)V PLio/grpc/Metadata$2;->build(Lcom/bumptech/glide/load/model/MultiModelLoaderFactory;)Lcom/bumptech/glide/load/model/ModelLoader; PLio/grpc/Metadata$2;->canLog(I)Z PLio/grpc/Metadata$2;->create(Lcom/google/firebase/components/ComponentContainer;)Ljava/lang/Object; PLio/grpc/Metadata$2;->d(Ljava/lang/String;)V PLio/grpc/Metadata$2;->transcode(Lcom/bumptech/glide/load/engine/Resource;Lcom/bumptech/glide/load/Options;)Lcom/bumptech/glide/load/engine/Resource; PLio/grpc/Metadata$2;->zza()Ljava/lang/Object; PLio/grpc/ServiceProviders$1;->(Ljava/lang/Object;I)V PLio/grpc/Status;->()V PLio/grpc/Status;->()V PLio/grpc/Status;->canonicalize(Ljava/lang/reflect/Type;)Ljava/lang/reflect/Type; PLio/grpc/Status;->checkCompatibleTheme(Landroid/content/Context;Landroid/util/AttributeSet;II)V PLio/grpc/Status;->checkNotPrimitive(Ljava/lang/reflect/Type;)V PLio/grpc/Status;->checkTextAppearance(Landroid/content/Context;Landroid/util/AttributeSet;[III[I)V PLio/grpc/Status;->checkTheme(Landroid/content/Context;[ILjava/lang/String;)V PLio/grpc/Status;->combineInternal(Lkotlinx/coroutines/flow/FlowCollector;[Lkotlinx/coroutines/flow/Flow;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function3;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLio/grpc/Status;->dexKeySeparator([B)Ljava/lang/String; PLio/grpc/Status;->equals(Ljava/lang/reflect/Type;Ljava/lang/reflect/Type;)Z PLio/grpc/Status;->getGenericSupertype(Ljava/lang/reflect/Type;Ljava/lang/Class;Ljava/lang/Class;)Ljava/lang/reflect/Type; PLio/grpc/Status;->getIndentFunction$StringsKt__IndentKt(Ljava/lang/String;)Lkotlin/jvm/functions/Function1; PLio/grpc/Status;->getRawType(Ljava/lang/reflect/Type;)Ljava/lang/Class; PLio/grpc/Status;->getSupertype(Ljava/lang/reflect/Type;Ljava/lang/Class;Ljava/lang/Class;)Ljava/lang/reflect/Type; PLio/grpc/Status;->mapCapacity(I)I PLio/grpc/Status;->obtainStyledAttributes(Landroid/content/Context;Landroid/util/AttributeSet;[III[I)Landroid/content/res/TypedArray; PLio/grpc/Status;->obtainTintedStyledAttributes(Landroid/content/Context;Landroid/util/AttributeSet;[III[I)Lcom/google/firebase/iid/zzk; PLio/grpc/Status;->plus-FjFbRPM(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLio/grpc/Status;->resolve(Ljava/lang/reflect/Type;Ljava/lang/Class;Ljava/lang/reflect/Type;)Ljava/lang/reflect/Type; PLio/grpc/Status;->resolve(Ljava/lang/reflect/Type;Ljava/lang/Class;Ljava/lang/reflect/Type;Ljava/util/Collection;)Ljava/lang/reflect/Type; PLio/grpc/Status;->systemProp$default(Ljava/lang/String;IIIILjava/lang/Object;)I PLio/grpc/Status;->systemProp$default(Ljava/lang/String;JJJILjava/lang/Object;)J PLio/grpc/Status;->systemProp(Ljava/lang/String;)Ljava/lang/String; PLio/grpc/Status;->systemProp(Ljava/lang/String;III)I PLio/grpc/Status;->systemProp(Ljava/lang/String;JJJ)J PLio/grpc/Status;->systemProp(Ljava/lang/String;Z)Z PLio/grpc/Status;->toSingletonMap(Ljava/util/Map;)Ljava/util/Map; PLio/grpc/Status;->trimMargin$default(Ljava/lang/String;Ljava/lang/String;I)Ljava/lang/String; PLkotlin/KotlinVersion;->()V PLkotlin/KotlinVersion;->(III)V PLkotlin/LazyKt__LazyKt;->SupervisorJob$default(Lkotlinx/coroutines/Job;I)Lkotlinx/coroutines/CompletableJob; PLkotlin/LazyKt__LazyKt;->asStateFlow(Lkotlinx/coroutines/flow/StateFlowImpl;)Lkotlinx/coroutines/flow/StateFlow; PLkotlin/LazyKt__LazyKt;->cancelConsumed(Lkotlinx/coroutines/channels/ReceiveChannel;Ljava/lang/Throwable;)V PLkotlin/LazyKt__LazyKt;->catchImpl(Lkotlinx/coroutines/flow/Flow;Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLkotlin/LazyKt__LazyKt;->coerceAtMost(JJ)J PLkotlin/LazyKt__LazyKt;->coerceIn(FFF)F PLkotlin/LazyKt__LazyKt;->coerceIn(III)I PLkotlin/LazyKt__LazyKt;->emitAll(Lkotlinx/coroutines/flow/FlowCollector;Lkotlinx/coroutines/flow/Flow;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLkotlin/LazyKt__LazyKt;->first(Lkotlinx/coroutines/flow/Flow;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLkotlin/LazyKt__LazyKt;->first(Lkotlinx/coroutines/flow/Flow;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLkotlin/LazyKt__LazyKt;->flowCombineTransform(Lkotlinx/coroutines/flow/Flow;Lkotlinx/coroutines/flow/Flow;Lkotlin/jvm/functions/Function4;)Lkotlinx/coroutines/flow/Flow; PLkotlin/LazyKt__LazyKt;->get(Ljava/lang/Object;Ljava/lang/Class;)Ljava/lang/Object; PLkotlin/LazyKt__LazyKt;->lazy(Lkotlin/jvm/functions/Function0;)Lkotlin/Lazy; PLkotlin/LazyKt__LazyKt;->mapLatest(Lkotlinx/coroutines/flow/Flow;Lkotlin/jvm/functions/Function2;)Lkotlinx/coroutines/flow/Flow; PLkotlin/LazyKt__LazyKt;->mod(II)I PLkotlin/LazyKt__LazyKt;->onEach(Lkotlinx/coroutines/flow/Flow;Lkotlin/jvm/functions/Function2;)Lkotlinx/coroutines/flow/Flow; PLkotlin/LazyKt__LazyKt;->plus(Lkotlin/coroutines/CoroutineContext$Element;Lkotlin/coroutines/CoroutineContext;)Lkotlin/coroutines/CoroutineContext; PLkotlin/LazyKt__LazyKt;->receiveAsFlow(Lkotlinx/coroutines/channels/ReceiveChannel;)Lkotlinx/coroutines/flow/Flow; PLkotlin/LazyKt__LazyKt;->runBlocking(Lkotlin/coroutines/CoroutineContext;Lkotlin/jvm/functions/Function2;)Ljava/lang/Object; PLkotlin/LazyKt__LazyKt;->shareIn$default(Lkotlinx/coroutines/flow/Flow;Lkotlinx/coroutines/CoroutineScope;Lkotlinx/coroutines/flow/SharingStarted;IILjava/lang/Object;)Lkotlinx/coroutines/flow/SharedFlow; PLkotlin/LazyKt__LazyKt;->shareIn(Lkotlinx/coroutines/flow/Flow;Lkotlinx/coroutines/CoroutineScope;Lkotlinx/coroutines/flow/SharingStarted;I)Lkotlinx/coroutines/flow/SharedFlow; PLkotlin/LazyKt__LazyKt;->stateIn(Lkotlinx/coroutines/flow/Flow;Lkotlinx/coroutines/CoroutineScope;Lkotlinx/coroutines/flow/SharingStarted;Ljava/lang/Object;)Lkotlinx/coroutines/flow/StateFlow; PLkotlin/LazyKt__LazyKt;->transformLatest(Lkotlinx/coroutines/flow/Flow;Lkotlin/jvm/functions/Function3;)Lkotlinx/coroutines/flow/Flow; PLkotlin/LazyKt__LazyKt;->until(II)Lkotlin/ranges/IntRange; PLkotlin/Result;->()V PLkotlin/ResultKt;->()V PLkotlin/ResultKt;->cancel$default(Lkotlinx/coroutines/Job;Ljava/util/concurrent/CancellationException;ILjava/lang/Object;)V PLkotlin/ResultKt;->cancelIfActive(Lkotlinx/coroutines/Job;)V PLkotlin/ResultKt;->checkState(ZLjava/lang/String;[Ljava/lang/Object;)V PLkotlin/ResultKt;->clearDecorations(Landroidx/recyclerview/widget/RecyclerView;)V PLkotlin/ResultKt;->closeFinally(Ljava/io/Closeable;Ljava/lang/Throwable;)V PLkotlin/ResultKt;->compareBy([Lkotlin/jvm/functions/Function1;)Ljava/util/Comparator; PLkotlin/ResultKt;->create(Ljava/lang/String;Ljava/lang/String;)Lcom/google/firebase/components/Component; PLkotlin/ResultKt;->doOnApplyWindowInsets(Landroid/view/View;Lcom/google/android/material/internal/ViewUtils$OnApplyWindowInsetsListener;)V PLkotlin/ResultKt;->fuse$default(Lkotlinx/coroutines/flow/internal/FusibleFlow;Lkotlin/coroutines/CoroutineContext;ILkotlinx/coroutines/channels/BufferOverflow;ILjava/lang/Object;)Lkotlinx/coroutines/flow/Flow; PLkotlin/ResultKt;->getDelay(Lkotlin/coroutines/CoroutineContext;)Lkotlinx/coroutines/Delay; PLkotlin/ResultKt;->getViewModelScope(Landroidx/lifecycle/ViewModel;)Lkotlinx/coroutines/CoroutineScope; PLkotlin/ResultKt;->isFragmentGetContextFixDisabled(Landroid/content/Context;)Z PLkotlin/ResultKt;->parseTintMode(ILandroid/graphics/PorterDuff$Mode;)Landroid/graphics/PorterDuff$Mode; PLkotlin/ResultKt;->setupProfileMenuItem(Landroidx/appcompat/widget/Toolbar;Lcom/google/samples/apps/iosched/ui/MainActivityViewModel;Landroidx/lifecycle/LifecycleOwner;)V PLkotlin/ResultKt;->toEpochMilli(Lorg/threeten/bp/ZonedDateTime;)J PLkotlin/SafePublicationLazyImpl;->()V PLkotlin/SynchronizedLazyImpl;->(Lkotlin/jvm/functions/Function0;Ljava/lang/Object;I)V PLkotlin/SynchronizedLazyImpl;->getValue()Ljava/lang/Object; PLkotlin/TuplesKt$$ExternalSyntheticCheckNotZero0;->_determineFrom(Ljava/lang/String;)I PLkotlin/TuplesKt$$ExternalSyntheticCheckNotZero0;->_values$1()[I PLkotlin/TuplesKt$$ExternalSyntheticCheckNotZero0;->_values()[I PLkotlin/TuplesKt$$ExternalSyntheticCheckNotZero0;->getId(I)I PLkotlin/TuplesKt$$ExternalSyntheticCheckNotZero0;->m$1()Ljava/util/Iterator; PLkotlin/TuplesKt$$ExternalSyntheticCheckNotZero0;->m$1(ILjava/lang/String;)V PLkotlin/TuplesKt$$ExternalSyntheticCheckNotZero0;->m()Ljava/util/Iterator; PLkotlin/TuplesKt$$ExternalSyntheticCheckNotZero0;->m(ILjava/lang/String;)V PLkotlin/TuplesKt$$ExternalSyntheticCheckNotZero0;->m(Lcom/google/samples/apps/iosched/ui/Hilt_MainActivity;I)V PLkotlin/TuplesKt;->()V PLkotlin/TuplesKt;->MutableSharedFlow$default(IILkotlinx/coroutines/channels/BufferOverflow;I)Lkotlinx/coroutines/flow/MutableSharedFlow; PLkotlin/TuplesKt;->MutableSharedFlow(IILkotlinx/coroutines/channels/BufferOverflow;)Lkotlinx/coroutines/flow/MutableSharedFlow; PLkotlin/TuplesKt;->cancel$default(Lkotlin/coroutines/CoroutineContext;Ljava/util/concurrent/CancellationException;ILjava/lang/Object;)V PLkotlin/TuplesKt;->cancel(Lkotlin/coroutines/CoroutineContext;Ljava/util/concurrent/CancellationException;)V PLkotlin/TuplesKt;->checkParameterIsNotNull(Ljava/lang/Object;Ljava/lang/String;)V PLkotlin/TuplesKt;->convertToRippleDrawableColor(Landroid/content/res/ColorStateList;)Landroid/content/res/ColorStateList; PLkotlin/TuplesKt;->enabled(II)Z PLkotlin/TuplesKt;->get(Lorg/threeten/bp/temporal/TemporalField;)I PLkotlin/TuplesKt;->getApplication(Landroid/content/Context;)Landroid/app/Application; PLkotlin/TuplesKt;->getColorForState(Landroid/content/res/ColorStateList;[I)I PLkotlin/TuplesKt;->isCancellableMode(I)Z PLkotlin/TuplesKt;->isWhitespace(C)Z PLkotlin/TuplesKt;->listOf(Ljava/lang/Object;)Ljava/util/List; PLkotlin/TuplesKt;->listOf([Ljava/lang/Object;)Ljava/util/List; PLkotlin/TuplesKt;->optimizeReadOnlyList(Ljava/util/List;)Ljava/util/List; PLkotlin/TuplesKt;->range(Lorg/threeten/bp/temporal/TemporalField;)Lorg/threeten/bp/temporal/ValueRange; PLkotlin/TuplesKt;->sanitizeRippleDrawableColor(Landroid/content/res/ColorStateList;)Landroid/content/res/ColorStateList; PLkotlin/TuplesKt;->setContentMaxWidth(Landroid/view/View;)V PLkotlin/TuplesKt;->setupSnackbarManager(Landroidx/fragment/app/Fragment;Lcom/google/samples/apps/iosched/ui/messages/SnackbarMessageManager;Lcom/google/samples/apps/iosched/widget/FadingSnackbar;)V PLkotlin/ULong$Companion;->(I)V PLkotlin/ULong$Companion;->(Lkotlin/LazyKt__LazyKt;I)V PLkotlin/ULong$Companion;->checkElementIndex$kotlin_stdlib(II)V PLkotlin/ULong$Companion;->closed-JP2dKIU(Ljava/lang/Throwable;)Ljava/lang/Object; PLkotlin/ULong$Companion;->queryFrom(Lorg/threeten/bp/temporal/TemporalAccessor;)Ljava/lang/Object; PLkotlin/Unit;->()V PLkotlin/Unit;->()V PLkotlin/collections/AbstractList;->()V PLkotlin/collections/AbstractMap$toString$1;->(Ljava/lang/Object;I)V PLkotlin/collections/AbstractMap$toString$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; PLkotlin/collections/AbstractMutableList;->()V PLkotlin/collections/AbstractMutableList;->size()I PLkotlin/collections/ArrayDeque;->()V PLkotlin/collections/ArrayDeque;->()V PLkotlin/collections/ArrayDeque;->addAll(Ljava/util/Collection;)Z PLkotlin/collections/ArrayDeque;->addFirst(Ljava/lang/Object;)V PLkotlin/collections/ArrayDeque;->addLast(Ljava/lang/Object;)V PLkotlin/collections/ArrayDeque;->copyCollectionElements(ILjava/util/Collection;)V PLkotlin/collections/ArrayDeque;->decremented(I)I PLkotlin/collections/ArrayDeque;->ensureCapacity(I)V PLkotlin/collections/ArrayDeque;->first()Ljava/lang/Object; PLkotlin/collections/ArrayDeque;->firstOrNull()Ljava/lang/Object; PLkotlin/collections/ArrayDeque;->getSize()I PLkotlin/collections/ArrayDeque;->isEmpty()Z PLkotlin/collections/ArrayDeque;->last()Ljava/lang/Object; PLkotlin/collections/ArrayDeque;->lastOrNull()Ljava/lang/Object; PLkotlin/collections/ArrayDeque;->toArray()[Ljava/lang/Object; PLkotlin/collections/ArrayDeque;->toArray([Ljava/lang/Object;)[Ljava/lang/Object; PLkotlin/collections/CollectionsKt__ReversedViewsKt;->addAll(Ljava/util/Collection;Ljava/lang/Iterable;)Z PLkotlin/collections/CollectionsKt___CollectionsKt;->first(Ljava/util/List;)Ljava/lang/Object; PLkotlin/collections/CollectionsKt___CollectionsKt;->intersect(Ljava/lang/Iterable;Ljava/lang/Iterable;)Ljava/util/Set; PLkotlin/collections/CollectionsKt___CollectionsKt;->joinTo$default(Ljava/lang/Iterable;Ljava/lang/Appendable;Ljava/lang/CharSequence;Ljava/lang/CharSequence;Ljava/lang/CharSequence;ILjava/lang/CharSequence;Lkotlin/jvm/functions/Function1;I)Ljava/lang/Appendable; PLkotlin/collections/CollectionsKt___CollectionsKt;->last(Ljava/util/List;)Ljava/lang/Object; PLkotlin/collections/CollectionsKt___CollectionsKt;->maxOrNull(Ljava/lang/Iterable;)Ljava/lang/Comparable; PLkotlin/collections/CollectionsKt___CollectionsKt;->plus(Ljava/util/Collection;Ljava/lang/Object;)Ljava/util/List; PLkotlin/collections/CollectionsKt___CollectionsKt;->sortedWith(Ljava/lang/Iterable;Ljava/util/Comparator;)Ljava/util/List; PLkotlin/collections/CollectionsKt___CollectionsKt;->toMutableSet(Ljava/lang/Iterable;)Ljava/util/Set; PLkotlin/collections/EmptyIterator;->()V PLkotlin/collections/EmptyIterator;->()V PLkotlin/collections/EmptyIterator;->hasNext()Z PLkotlin/collections/EmptyIterator;->hasPrevious()Z PLkotlin/collections/EmptyList;->()V PLkotlin/collections/EmptyList;->()V PLkotlin/collections/EmptyList;->equals(Ljava/lang/Object;)Z PLkotlin/collections/EmptyList;->isEmpty()Z PLkotlin/collections/EmptyList;->iterator()Ljava/util/Iterator; PLkotlin/collections/EmptyList;->listIterator(I)Ljava/util/ListIterator; PLkotlin/collections/EmptyList;->size()I PLkotlin/collections/EmptyList;->toArray()[Ljava/lang/Object; PLkotlin/collections/EmptyMap;->()V PLkotlin/collections/EmptyMap;->()V PLkotlin/collections/EmptyMap;->entrySet()Ljava/util/Set; PLkotlin/collections/EmptyMap;->keySet()Ljava/util/Set; PLkotlin/collections/EmptyMap;->size()I PLkotlin/collections/EmptySet;->()V PLkotlin/collections/EmptySet;->()V PLkotlin/collections/EmptySet;->contains(Ljava/lang/Object;)Z PLkotlin/collections/EmptySet;->iterator()Ljava/util/Iterator; PLkotlin/collections/IndexedValue;->(ILjava/lang/Object;)V PLkotlin/collections/MapsKt___MapsKt;->mutableMapOf([Lkotlin/Pair;)Ljava/util/Map; PLkotlin/collections/MapsKt___MapsKt;->putAll(Ljava/util/Map;[Lkotlin/Pair;)V PLkotlin/collections/MapsKt___MapsKt;->toMap(Ljava/lang/Iterable;)Ljava/util/Map; PLkotlin/collections/MapsKt___MapsKt;->toMap(Ljava/lang/Iterable;Ljava/util/Map;)Ljava/util/Map; PLkotlin/collections/MapsKt___MapsKt;->toMap(Ljava/util/Map;)Ljava/util/Map; PLkotlin/collections/MapsKt___MapsKt;->toMutableMap(Ljava/util/Map;)Ljava/util/Map; PLkotlin/coroutines/AbstractCoroutineContextElement;->(Lkotlin/coroutines/CoroutineContext$Key;)V PLkotlin/coroutines/AbstractCoroutineContextElement;->getKey()Lkotlin/coroutines/CoroutineContext$Key; PLkotlin/coroutines/AbstractCoroutineContextElement;->plus(Lkotlin/coroutines/CoroutineContext;)Lkotlin/coroutines/CoroutineContext; PLkotlin/coroutines/AbstractCoroutineContextKey;->(Lkotlin/coroutines/CoroutineContext$Key;Lkotlin/jvm/functions/Function1;)V PLkotlin/coroutines/CombinedContext;->equals(Ljava/lang/Object;)Z PLkotlin/coroutines/CombinedContext;->size()I PLkotlin/coroutines/CoroutineContext$plus$1;->()V PLkotlin/coroutines/CoroutineContext$plus$1;->(I)V PLkotlin/coroutines/EmptyCoroutineContext;->()V PLkotlin/coroutines/EmptyCoroutineContext;->()V PLkotlin/coroutines/EmptyCoroutineContext;->get(Lkotlin/coroutines/CoroutineContext$Key;)Lkotlin/coroutines/CoroutineContext$Element; PLkotlin/coroutines/EmptyCoroutineContext;->plus(Lkotlin/coroutines/CoroutineContext;)Lkotlin/coroutines/CoroutineContext; PLkotlin/coroutines/intrinsics/CoroutineSingletons;->()V PLkotlin/coroutines/intrinsics/CoroutineSingletons;->(Ljava/lang/String;I)V PLkotlin/coroutines/jvm/internal/CompletedContinuation;->()V PLkotlin/coroutines/jvm/internal/CompletedContinuation;->()V PLkotlin/coroutines/jvm/internal/ContinuationImpl;->(Lkotlin/coroutines/Continuation;Lkotlin/coroutines/CoroutineContext;)V PLkotlin/internal/PlatformImplementations;->()V PLkotlin/internal/PlatformImplementations;->defaultPlatformRandom()Lkotlin/random/Random; PLkotlin/internal/PlatformImplementationsKt;->()V PLkotlin/jvm/internal/ArrayIterator;->(Ljava/lang/Object;I)V PLkotlin/jvm/internal/CallableReference$NoReceiver;->()V PLkotlin/jvm/internal/CallableReference$NoReceiver;->()V PLkotlin/jvm/internal/CallableReference;->(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/String;Ljava/lang/String;Z)V PLkotlin/jvm/internal/ClassReference;->()V PLkotlin/jvm/internal/ClassReference;->(Ljava/lang/Class;)V PLkotlin/jvm/internal/ClassReference;->getJClass()Ljava/lang/Class; PLkotlin/jvm/internal/FunctionReferenceImpl;->(ILjava/lang/Class;Ljava/lang/String;Ljava/lang/String;I)V PLkotlin/jvm/internal/FunctionReferenceImpl;->getArity()I PLkotlin/jvm/internal/PropertyReference2Impl;->(Ljava/lang/Class;Ljava/lang/String;Ljava/lang/String;I)V PLkotlin/jvm/internal/PropertyReference;->(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/String;Ljava/lang/String;I)V PLkotlin/jvm/internal/Ref$BooleanRef;->()V PLkotlin/jvm/internal/Ref$ObjectRef;->()V PLkotlin/jvm/internal/Reflection;->()V PLkotlin/jvm/internal/Reflection;->getOrCreateKotlinClass(Ljava/lang/Class;)Lkotlin/reflect/KClass; PLkotlin/jvm/internal/ReflectionFactory;->()V PLkotlin/math/MathKt;->asList([Ljava/lang/Object;)Ljava/util/List; PLkotlin/math/MathKt;->copyInto$default([Ljava/lang/Object;[Ljava/lang/Object;IIII)[Ljava/lang/Object; PLkotlin/math/MathKt;->copyInto([Ljava/lang/Object;[Ljava/lang/Object;III)[Ljava/lang/Object; PLkotlin/math/MathKt;->fill([Ljava/lang/Object;Ljava/lang/Object;II)V PLkotlin/math/MathKt;->getLastIndex([Ljava/lang/Object;)I PLkotlin/random/AbstractPlatformRandom;->()V PLkotlin/random/AbstractPlatformRandom;->nextInt()I PLkotlin/random/FallbackThreadLocalRandom;->()V PLkotlin/random/FallbackThreadLocalRandom;->getImpl()Ljava/util/Random; PLkotlin/random/Random$Default;->(Lkotlin/LazyKt__LazyKt;)V PLkotlin/random/Random;->()V PLkotlin/random/Random;->()V PLkotlin/ranges/IntProgression;->()V PLkotlin/ranges/IntProgression;->iterator()Ljava/util/Iterator; PLkotlin/ranges/IntProgressionIterator;->(III)V PLkotlin/ranges/IntProgressionIterator;->nextInt()I PLkotlin/ranges/IntRange;->()V PLkotlin/sequences/ConstrainedOnceSequence;->(Lkotlin/sequences/Sequence;)V PLkotlin/sequences/ConstrainedOnceSequence;->iterator()Ljava/util/Iterator; PLkotlin/sequences/FilteringSequence$iterator$1;->(Lkotlin/sequences/FilteringSequence;)V PLkotlin/sequences/FilteringSequence$iterator$1;->calcNext()V PLkotlin/sequences/FilteringSequence$iterator$1;->hasNext()Z PLkotlin/sequences/FilteringSequence$iterator$1;->next()Ljava/lang/Object; PLkotlin/sequences/FilteringSequence;->(Lkotlin/sequences/Sequence;ZLkotlin/jvm/functions/Function1;)V PLkotlin/sequences/GeneratorSequence$iterator$1;->(Lkotlin/sequences/TakeWhileSequence;)V PLkotlin/sequences/GeneratorSequence$iterator$1;->calcNext()V PLkotlin/sequences/GeneratorSequence$iterator$1;->hasNext()Z PLkotlin/sequences/GeneratorSequence$iterator$1;->next()Ljava/lang/Object; PLkotlin/sequences/SequencesKt;->toList(Lkotlin/sequences/Sequence;)Ljava/util/List; PLkotlin/sequences/SequencesKt;->toMutableList(Lkotlin/sequences/Sequence;)Ljava/util/List; PLkotlin/sequences/SequencesKt__SequencesKt$asSequence$$inlined$Sequence$1;->(Ljava/lang/Object;I)V PLkotlin/sequences/SequencesKt__SequencesKt$asSequence$$inlined$Sequence$1;->iterator()Ljava/util/Iterator; PLkotlin/sequences/SequencesKt___SequencesJvmKt;->asSequence(Ljava/util/Iterator;)Lkotlin/sequences/Sequence; PLkotlin/sequences/SequencesKt___SequencesJvmKt;->generateSequence(Ljava/lang/Object;Lkotlin/jvm/functions/Function1;)Lkotlin/sequences/Sequence; PLkotlin/sequences/TakeWhileSequence;->(Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function1;)V PLkotlin/sequences/TakeWhileSequence;->(Lkotlin/sequences/Sequence;Lkotlin/jvm/functions/Function1;I)V PLkotlin/sequences/TakeWhileSequence;->iterator()Ljava/util/Iterator; PLkotlin/sequences/TransformingSequence$iterator$1;->(Lkotlin/sequences/TakeWhileSequence;)V PLkotlin/sequences/TransformingSequence$iterator$1;->hasNext()Z PLkotlin/sequences/TransformingSequence$iterator$1;->next()Ljava/lang/Object; PLkotlin/text/Charsets;->()V PLkotlin/text/DelimitedRangesSequence$iterator$1;->(Lkotlin/text/DelimitedRangesSequence;)V PLkotlin/text/DelimitedRangesSequence$iterator$1;->calcNext()V PLkotlin/text/DelimitedRangesSequence$iterator$1;->hasNext()Z PLkotlin/text/DelimitedRangesSequence$iterator$1;->next()Ljava/lang/Object; PLkotlin/text/DelimitedRangesSequence;->(Ljava/lang/CharSequence;IILkotlin/jvm/functions/Function2;)V PLkotlin/text/DelimitedRangesSequence;->iterator()Ljava/util/Iterator; PLkotlin/text/StringsKt__StringsKt$rangesDelimitedBy$2;->(Ljava/util/List;Z)V PLkotlin/text/StringsKt__StringsKt;->endsWith$default(Ljava/lang/String;Ljava/lang/String;ZI)Z PLkotlin/text/StringsKt__StringsKt;->getLastIndex(Ljava/lang/CharSequence;)I PLkotlin/text/StringsKt__StringsKt;->indexOf$default(Ljava/lang/CharSequence;CIZI)I PLkotlin/text/StringsKt__StringsKt;->isBlank(Ljava/lang/CharSequence;)Z PLkotlin/text/StringsKt__StringsKt;->lastIndexOf$default(Ljava/lang/CharSequence;CIZI)I PLkotlin/text/StringsKt__StringsKt;->lines(Ljava/lang/CharSequence;)Ljava/util/List; PLkotlin/text/StringsKt__StringsKt;->rangesDelimitedBy$StringsKt__StringsKt$default(Ljava/lang/CharSequence;[Ljava/lang/String;IZII)Lkotlin/sequences/Sequence; PLkotlin/text/StringsKt__StringsKt;->regionMatches(Ljava/lang/String;ILjava/lang/String;IIZ)Z PLkotlin/text/StringsKt__StringsKt;->requireNonNegativeLimit(I)V PLkotlin/text/StringsKt__StringsKt;->startsWith$default(Ljava/lang/String;Ljava/lang/String;ZI)Z PLkotlin/text/StringsKt__StringsKt;->substring(Ljava/lang/CharSequence;Lkotlin/ranges/IntRange;)Ljava/lang/String; PLkotlin/text/StringsKt__StringsKt;->substringAfterLast$default(Ljava/lang/String;CLjava/lang/String;I)Ljava/lang/String; PLkotlin/text/StringsKt__StringsKt;->substringAfterLast(Ljava/lang/String;CLjava/lang/String;)Ljava/lang/String; PLkotlinx/coroutines/AbstractCoroutine;->cancellationExceptionMessage()Ljava/lang/String; PLkotlinx/coroutines/AbstractCoroutine;->onCancelled(Ljava/lang/Throwable;Z)V PLkotlinx/coroutines/AbstractCoroutine;->onCompleted(Ljava/lang/Object;)V PLkotlinx/coroutines/Active;->()V PLkotlinx/coroutines/Active;->()V PLkotlinx/coroutines/BlockingCoroutine;->(Lkotlin/coroutines/CoroutineContext;Ljava/lang/Thread;Lkotlinx/coroutines/EventLoopImplPlatform;)V PLkotlinx/coroutines/BlockingCoroutine;->afterCompletion(Ljava/lang/Object;)V PLkotlinx/coroutines/BlockingEventLoop;->(Ljava/lang/Thread;)V PLkotlinx/coroutines/BlockingEventLoop;->getThread()Ljava/lang/Thread; PLkotlinx/coroutines/CancellableContinuationImpl;->()V PLkotlinx/coroutines/CancellableContinuationImpl;->callCancelHandler(Lkotlinx/coroutines/CancelHandler;Ljava/lang/Throwable;)V PLkotlinx/coroutines/CancellableContinuationImpl;->resumeUndispatched(Lkotlinx/coroutines/CoroutineDispatcher;Ljava/lang/Object;)V PLkotlinx/coroutines/CancelledContinuation;->()V PLkotlinx/coroutines/ChildHandleNode;->childCancelled(Ljava/lang/Throwable;)Z PLkotlinx/coroutines/ChildHandleNode;->getParent()Lkotlinx/coroutines/Job; PLkotlinx/coroutines/CompletedExceptionally;->()V PLkotlinx/coroutines/CoroutineDispatcher$Key$1;->()V PLkotlinx/coroutines/CoroutineDispatcher$Key$1;->(I)V PLkotlinx/coroutines/CoroutineDispatcher$Key;->(I)V PLkotlinx/coroutines/CoroutineDispatcher;->()V PLkotlinx/coroutines/CoroutineDispatcher;->()V PLkotlinx/coroutines/CoroutineDispatcher;->dispatchYield(Lkotlin/coroutines/CoroutineContext;Ljava/lang/Runnable;)V PLkotlinx/coroutines/CoroutineExceptionHandlerImplKt;->()V PLkotlinx/coroutines/DefaultExecutorKt;->()V PLkotlinx/coroutines/DispatchedCoroutine;->()V PLkotlinx/coroutines/DispatchedCoroutine;->(Lkotlin/coroutines/CoroutineContext;Lkotlin/coroutines/Continuation;)V PLkotlinx/coroutines/DispatchedTask;->getSuccessfulResult$kotlinx_coroutines_core(Ljava/lang/Object;)Ljava/lang/Object; PLkotlinx/coroutines/DispatchedTask;->handleFatalException(Ljava/lang/Throwable;Ljava/lang/Throwable;)V PLkotlinx/coroutines/Dispatchers;->()V PLkotlinx/coroutines/Empty;->(Z)V PLkotlinx/coroutines/Empty;->getList()Lkotlinx/coroutines/NodeList; PLkotlinx/coroutines/EventLoopImplBase;->()V PLkotlinx/coroutines/EventLoopImplBase;->()V PLkotlinx/coroutines/EventLoopImplBase;->dispatch(Lkotlin/coroutines/CoroutineContext;Ljava/lang/Runnable;)V PLkotlinx/coroutines/EventLoopImplBase;->enqueue(Ljava/lang/Runnable;)V PLkotlinx/coroutines/EventLoopImplBase;->enqueueImpl(Ljava/lang/Runnable;)Z PLkotlinx/coroutines/EventLoopImplBase;->processNextEvent()J PLkotlinx/coroutines/EventLoopImplBase;->shutdown()V PLkotlinx/coroutines/EventLoopImplPlatform;->()V PLkotlinx/coroutines/EventLoopImplPlatform;->delta(Z)J PLkotlinx/coroutines/ExecutorCoroutineDispatcher;->()V PLkotlinx/coroutines/ExecutorCoroutineDispatcherImpl;->(Ljava/util/concurrent/Executor;)V PLkotlinx/coroutines/ExecutorCoroutineDispatcherImpl;->dispatch(Lkotlin/coroutines/CoroutineContext;Ljava/lang/Runnable;)V PLkotlinx/coroutines/InvokeOnCancel;->(Ljava/lang/Object;I)V PLkotlinx/coroutines/InvokeOnCancel;->invoke(Ljava/lang/Throwable;)V PLkotlinx/coroutines/InvokeOnCompletion;->(Ljava/lang/Object;I)V PLkotlinx/coroutines/InvokeOnCompletion;->invoke(Ljava/lang/Throwable;)V PLkotlinx/coroutines/Job;->()V PLkotlinx/coroutines/JobCancellationException;->(Ljava/lang/String;Ljava/lang/Throwable;Lkotlinx/coroutines/Job;)V PLkotlinx/coroutines/JobCancellationException;->equals(Ljava/lang/Object;)Z PLkotlinx/coroutines/JobCancellationException;->fillInStackTrace()Ljava/lang/Throwable; PLkotlinx/coroutines/JobImpl;->(Lkotlinx/coroutines/Job;)V PLkotlinx/coroutines/JobImpl;->getOnCancelComplete$kotlinx_coroutines_core()Z PLkotlinx/coroutines/JobNode;->getList()Lkotlinx/coroutines/NodeList; PLkotlinx/coroutines/JobNode;->isActive()Z PLkotlinx/coroutines/JobSupport$ChildCompletion;->(Lkotlinx/coroutines/JobSupport;Lkotlinx/coroutines/JobSupport$Finishing;Lkotlinx/coroutines/ChildHandleNode;Ljava/lang/Object;)V PLkotlinx/coroutines/JobSupport$ChildCompletion;->invoke(Ljava/lang/Throwable;)V PLkotlinx/coroutines/JobSupport$Finishing;->isActive()Z PLkotlinx/coroutines/JobSupport$Finishing;->isSealed()Z PLkotlinx/coroutines/JobSupport;->()V PLkotlinx/coroutines/JobSupport;->afterCompletion(Ljava/lang/Object;)V PLkotlinx/coroutines/JobSupport;->cancelInternal(Ljava/lang/Throwable;)V PLkotlinx/coroutines/JobSupport;->cancellationExceptionMessage()Ljava/lang/String; PLkotlinx/coroutines/JobSupport;->childCancelled(Ljava/lang/Throwable;)Z PLkotlinx/coroutines/JobSupport;->getParentHandle$kotlinx_coroutines_core()Lkotlinx/coroutines/ChildHandle; PLkotlinx/coroutines/JobSupport;->isCancelled()Z PLkotlinx/coroutines/JobSupport;->onCompletionInternal(Ljava/lang/Object;)V PLkotlinx/coroutines/JobSupport;->toCancellationException$default(Lkotlinx/coroutines/JobSupport;Ljava/lang/Throwable;Ljava/lang/String;ILjava/lang/Object;)Ljava/util/concurrent/CancellationException; PLkotlinx/coroutines/JobSupport;->tryWaitForChild(Lkotlinx/coroutines/JobSupport$Finishing;Lkotlinx/coroutines/ChildHandleNode;Ljava/lang/Object;)Z PLkotlinx/coroutines/MainCoroutineDispatcher;->()V PLkotlinx/coroutines/NodeList;->getList()Lkotlinx/coroutines/NodeList; PLkotlinx/coroutines/NodeList;->isActive()Z PLkotlinx/coroutines/NonDisposableHandle;->()V PLkotlinx/coroutines/NonDisposableHandle;->()V PLkotlinx/coroutines/NonDisposableHandle;->dispose()V PLkotlinx/coroutines/SupervisorJobImpl;->(Lkotlinx/coroutines/Job;)V PLkotlinx/coroutines/SupervisorJobImpl;->childCancelled(Ljava/lang/Throwable;)Z PLkotlinx/coroutines/ThreadLocalEventLoop;->()V PLkotlinx/coroutines/Unconfined;->()V PLkotlinx/coroutines/Unconfined;->()V PLkotlinx/coroutines/UndispatchedMarker;->()V PLkotlinx/coroutines/UndispatchedMarker;->()V PLkotlinx/coroutines/UndispatchedMarker;->fold(Ljava/lang/Object;Lkotlin/jvm/functions/Function2;)Ljava/lang/Object; PLkotlinx/coroutines/UndispatchedMarker;->get(Lkotlin/coroutines/CoroutineContext$Key;)Lkotlin/coroutines/CoroutineContext$Element; PLkotlinx/coroutines/UndispatchedMarker;->getKey()Lkotlin/coroutines/CoroutineContext$Key; PLkotlinx/coroutines/YieldContext;->()V PLkotlinx/coroutines/YieldContext;->()V PLkotlinx/coroutines/android/AndroidDispatcherFactory;->()V PLkotlinx/coroutines/android/AndroidDispatcherFactory;->createDispatcher(Ljava/util/List;)Lkotlinx/coroutines/MainCoroutineDispatcher; PLkotlinx/coroutines/android/AndroidExceptionPreHandler;->()V PLkotlinx/coroutines/android/HandlerContext;->(Landroid/os/Handler;Ljava/lang/String;Z)V PLkotlinx/coroutines/android/HandlerContext;->dispatch(Lkotlin/coroutines/CoroutineContext;Ljava/lang/Runnable;)V PLkotlinx/coroutines/android/HandlerDispatcher;->(Lkotlin/LazyKt__LazyKt;)V PLkotlinx/coroutines/android/HandlerDispatcherKt;->()V PLkotlinx/coroutines/android/HandlerDispatcherKt;->asHandler(Landroid/os/Looper;Z)Landroid/os/Handler; PLkotlinx/coroutines/channels/AbstractChannel$Itr;->(Lkotlinx/coroutines/channels/AbstractChannel;)V PLkotlinx/coroutines/channels/AbstractChannel$Itr;->hasNext(Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLkotlinx/coroutines/channels/AbstractChannel$Itr;->hasNextResult(Ljava/lang/Object;)Z PLkotlinx/coroutines/channels/AbstractChannel$Itr;->next()Ljava/lang/Object; PLkotlinx/coroutines/channels/AbstractChannel$ReceiveHasNext;->(Lkotlinx/coroutines/channels/AbstractChannel$Itr;Lkotlinx/coroutines/CancellableContinuation;)V PLkotlinx/coroutines/channels/AbstractChannel$RemoveReceiveOnCancel;->invoke(Ljava/lang/Throwable;)V PLkotlinx/coroutines/channels/AbstractChannel;->(Lkotlin/jvm/functions/Function1;)V PLkotlinx/coroutines/channels/AbstractChannel;->cancel(Ljava/util/concurrent/CancellationException;)V PLkotlinx/coroutines/channels/AbstractChannel;->isClosedForReceive()Z PLkotlinx/coroutines/channels/AbstractChannel;->pollInternal()Ljava/lang/Object; PLkotlinx/coroutines/channels/AbstractChannel;->receive(Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLkotlinx/coroutines/channels/AbstractChannel;->tryReceive-PtdJZtk()Ljava/lang/Object; PLkotlinx/coroutines/channels/AbstractSendChannel$SendBuffered;->(Ljava/lang/Object;)V PLkotlinx/coroutines/channels/AbstractSendChannel$SendBuffered;->completeResumeSend()V PLkotlinx/coroutines/channels/AbstractSendChannel$SendBuffered;->getPollResult()Ljava/lang/Object; PLkotlinx/coroutines/channels/AbstractSendChannel$SendBuffered;->tryResumeSend(Lkotlinx/coroutines/internal/LockFreeLinkedListNode$PrepareOp;)Lkotlinx/coroutines/internal/Symbol; PLkotlinx/coroutines/channels/AbstractSendChannel;->()V PLkotlinx/coroutines/channels/AbstractSendChannel;->offer(Ljava/lang/Object;)Z PLkotlinx/coroutines/channels/AbstractSendChannel;->offerInternal(Ljava/lang/Object;)Ljava/lang/Object; PLkotlinx/coroutines/channels/AbstractSendChannel;->takeFirstSendOrPeekClosed()Lkotlinx/coroutines/channels/Send; PLkotlinx/coroutines/channels/AbstractSendChannel;->trySend-JP2dKIU(Ljava/lang/Object;)Ljava/lang/Object; PLkotlinx/coroutines/channels/ArrayChannel;->enqueueElement(ILjava/lang/Object;)V PLkotlinx/coroutines/channels/ArrayChannel;->isBufferAlwaysEmpty()Z PLkotlinx/coroutines/channels/ArrayChannel;->isBufferEmpty()Z PLkotlinx/coroutines/channels/ArrayChannel;->isClosedForReceive()Z PLkotlinx/coroutines/channels/BufferOverflow;->()V PLkotlinx/coroutines/channels/BufferOverflow;->(Ljava/lang/String;I)V PLkotlinx/coroutines/channels/Channel$Factory;->()V PLkotlinx/coroutines/channels/Channel$Factory;->()V PLkotlinx/coroutines/channels/Channel;->()V PLkotlinx/coroutines/channels/ChannelResult$Closed;->(Ljava/lang/Throwable;)V PLkotlinx/coroutines/channels/ChannelResult$Failed;->()V PLkotlinx/coroutines/channels/ChannelResult;->()V PLkotlinx/coroutines/channels/ChannelResult;->exceptionOrNull-impl(Ljava/lang/Object;)Ljava/lang/Throwable; PLkotlinx/coroutines/channels/ChannelResult;->getOrNull-impl(Ljava/lang/Object;)Ljava/lang/Object; PLkotlinx/coroutines/channels/ChannelResult;->getOrThrow-impl(Ljava/lang/Object;)Ljava/lang/Object; PLkotlinx/coroutines/channels/Closed;->(Ljava/lang/Throwable;)V PLkotlinx/coroutines/channels/ConflatedChannel;->(Lkotlin/jvm/functions/Function1;)V PLkotlinx/coroutines/channels/ConflatedChannel;->enqueueReceiveInternal(Lkotlinx/coroutines/channels/Receive;)Z PLkotlinx/coroutines/channels/ConflatedChannel;->isBufferAlwaysEmpty()Z PLkotlinx/coroutines/channels/ConflatedChannel;->isBufferEmpty()Z PLkotlinx/coroutines/channels/ConflatedChannel;->pollInternal()Ljava/lang/Object; PLkotlinx/coroutines/channels/LinkedListChannel;->(Lkotlin/jvm/functions/Function1;I)V PLkotlinx/coroutines/channels/LinkedListChannel;->isBufferAlwaysEmpty()Z PLkotlinx/coroutines/channels/LinkedListChannel;->offerInternal(Ljava/lang/Object;)Ljava/lang/Object; PLkotlinx/coroutines/channels/ProducerCoroutine;->(Lkotlin/coroutines/CoroutineContext;Lkotlinx/coroutines/channels/Channel;)V PLkotlinx/coroutines/channels/ProducerCoroutine;->cancel(Ljava/util/concurrent/CancellationException;)V PLkotlinx/coroutines/channels/ProducerCoroutine;->cancelInternal(Ljava/lang/Throwable;)V PLkotlinx/coroutines/channels/ProducerCoroutine;->isActive()Z PLkotlinx/coroutines/channels/ProducerCoroutine;->onCancelled(Ljava/lang/Throwable;Z)V PLkotlinx/coroutines/channels/ProducerCoroutine;->onCompleted(Ljava/lang/Object;)V PLkotlinx/coroutines/channels/Receive;->()V PLkotlinx/coroutines/channels/Receive;->getOfferResult()Ljava/lang/Object; PLkotlinx/coroutines/channels/Receive;->resumeOnCancellationFun(Ljava/lang/Object;)Lkotlin/jvm/functions/Function1; PLkotlinx/coroutines/channels/Send;->()V PLkotlinx/coroutines/flow/AbstractFlow$collect$1;->(Lkotlinx/coroutines/flow/SafeFlow;Lkotlin/coroutines/Continuation;)V PLkotlinx/coroutines/flow/AbstractFlow$collect$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLkotlinx/coroutines/flow/CallbackFlowBuilder$collectTo$1;->(Lkotlinx/coroutines/flow/CallbackFlowBuilder;Lkotlin/coroutines/Continuation;)V PLkotlinx/coroutines/flow/CallbackFlowBuilder;->(Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/CoroutineContext;ILkotlinx/coroutines/channels/BufferOverflow;I)V PLkotlinx/coroutines/flow/CallbackFlowBuilder;->collectTo(Lkotlinx/coroutines/channels/ProducerScope;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLkotlinx/coroutines/flow/ChannelAsFlow;->()V PLkotlinx/coroutines/flow/ChannelAsFlow;->(Lkotlinx/coroutines/channels/ReceiveChannel;ZLkotlin/coroutines/CoroutineContext;ILkotlinx/coroutines/channels/BufferOverflow;I)V PLkotlinx/coroutines/flow/ChannelAsFlow;->collect(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLkotlinx/coroutines/flow/ChannelAsFlow;->dropChannelOperators()Lkotlinx/coroutines/flow/Flow; PLkotlinx/coroutines/flow/ChannelAsFlow;->markConsumed()V PLkotlinx/coroutines/flow/DistinctFlowImpl$collect$2$emit$1;->(Lkotlinx/coroutines/flow/DistinctFlowImpl$collect$2;Lkotlin/coroutines/Continuation;)V PLkotlinx/coroutines/flow/DistinctFlowImpl$collect$2$emit$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLkotlinx/coroutines/flow/DistinctFlowImpl$collect$2;->(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;I)V PLkotlinx/coroutines/flow/DistinctFlowImpl$collect$2;->(Lkotlinx/coroutines/flow/FlowCollector;Ljava/lang/Object;Ljava/lang/Object;I)V PLkotlinx/coroutines/flow/DistinctFlowImpl;->(Lkotlinx/coroutines/flow/Flow;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function2;)V PLkotlinx/coroutines/flow/FlowKt__BuildersKt$flowOf$$inlined$unsafeFlow$1$1;->(Lkotlinx/coroutines/flow/FlowKt__BuildersKt$flowOf$$inlined$unsafeFlow$1;Lkotlin/coroutines/Continuation;)V PLkotlinx/coroutines/flow/FlowKt__BuildersKt$flowOf$$inlined$unsafeFlow$1;->([Ljava/lang/Object;)V PLkotlinx/coroutines/flow/FlowKt__BuildersKt$flowOf$$inlined$unsafeFlow$1;->collect(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLkotlinx/coroutines/flow/FlowKt__ChannelsKt$emitAllImpl$1;->(Lkotlin/coroutines/Continuation;)V PLkotlinx/coroutines/flow/FlowKt__DistinctKt;->()V PLkotlinx/coroutines/flow/FlowKt__ErrorsKt$catch$$inlined$unsafeFlow$1$1;->(Lkotlinx/coroutines/flow/FlowKt__ErrorsKt$catch$$inlined$unsafeFlow$1;Lkotlin/coroutines/Continuation;)V PLkotlinx/coroutines/flow/FlowKt__ErrorsKt$catch$$inlined$unsafeFlow$1$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLkotlinx/coroutines/flow/FlowKt__ErrorsKt$catch$$inlined$unsafeFlow$1;->(Lkotlinx/coroutines/flow/Flow;Lkotlin/jvm/functions/Function3;)V PLkotlinx/coroutines/flow/FlowKt__ErrorsKt$catch$$inlined$unsafeFlow$1;->collect(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLkotlinx/coroutines/flow/FlowKt__ErrorsKt$catchImpl$1;->(Lkotlin/coroutines/Continuation;)V PLkotlinx/coroutines/flow/FlowKt__ErrorsKt$catchImpl$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLkotlinx/coroutines/flow/FlowKt__ErrorsKt$catchImpl$2$emit$1;->(Lkotlinx/coroutines/flow/FlowKt__ErrorsKt$catchImpl$2;Lkotlin/coroutines/Continuation;)V PLkotlinx/coroutines/flow/FlowKt__ErrorsKt$catchImpl$2;->(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/jvm/internal/Ref$ObjectRef;)V PLkotlinx/coroutines/flow/FlowKt__ErrorsKt$catchImpl$2;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLkotlinx/coroutines/flow/FlowKt__LimitKt$dropWhile$$inlined$unsafeFlow$1;->(Lkotlinx/coroutines/flow/Flow;Lkotlin/jvm/functions/Function2;I)V PLkotlinx/coroutines/flow/FlowKt__LimitKt$dropWhile$1$1$emit$1;->(Lkotlinx/coroutines/flow/FlowKt__LimitKt$dropWhile$1$1;Lkotlin/coroutines/Continuation;)V PLkotlinx/coroutines/flow/FlowKt__LimitKt$dropWhile$1$1$emit$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLkotlinx/coroutines/flow/FlowKt__LimitKt$dropWhile$1$1;->(Lkotlin/jvm/internal/Ref$BooleanRef;Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/jvm/functions/Function2;)V PLkotlinx/coroutines/flow/FlowKt__MergeKt;->()V PLkotlinx/coroutines/flow/FlowKt__ReduceKt$first$$inlined$collectWhile$1;->(Lkotlin/jvm/internal/Ref$ObjectRef;)V PLkotlinx/coroutines/flow/FlowKt__ReduceKt$first$$inlined$collectWhile$1;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLkotlinx/coroutines/flow/FlowKt__ReduceKt$first$$inlined$collectWhile$2$1;->(Lkotlinx/coroutines/flow/FlowKt__ReduceKt$first$$inlined$collectWhile$2;Lkotlin/coroutines/Continuation;)V PLkotlinx/coroutines/flow/FlowKt__ReduceKt$first$$inlined$collectWhile$2;->(Lkotlin/jvm/functions/Function2;Lkotlin/jvm/internal/Ref$ObjectRef;)V PLkotlinx/coroutines/flow/FlowKt__ReduceKt$first$$inlined$collectWhile$2;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLkotlinx/coroutines/flow/FlowKt__ReduceKt$first$1;->(Lkotlin/coroutines/Continuation;)V PLkotlinx/coroutines/flow/FlowKt__ReduceKt$first$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLkotlinx/coroutines/flow/FlowKt__ReduceKt$first$3;->(Lkotlin/coroutines/Continuation;)V PLkotlinx/coroutines/flow/FlowKt__ReduceKt$first$3;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLkotlinx/coroutines/flow/FlowKt__ShareKt$launchSharing$1$1;->(Lkotlin/coroutines/Continuation;)V PLkotlinx/coroutines/flow/FlowKt__ShareKt$launchSharing$1$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLkotlinx/coroutines/flow/FlowKt__ShareKt$launchSharing$1$2;->(Lkotlinx/coroutines/flow/Flow;Lkotlinx/coroutines/flow/MutableSharedFlow;Ljava/lang/Object;Lkotlin/coroutines/Continuation;)V PLkotlinx/coroutines/flow/FlowKt__ShareKt$launchSharing$1;->(Lkotlinx/coroutines/flow/SharingStarted;Lkotlinx/coroutines/flow/Flow;Lkotlinx/coroutines/flow/MutableSharedFlow;Ljava/lang/Object;Lkotlin/coroutines/Continuation;)V PLkotlinx/coroutines/flow/FlowKt__ShareKt$launchSharing$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; PLkotlinx/coroutines/flow/FlowKt__TransformKt$onEach$$inlined$unsafeTransform$1$2$1;->(Lkotlinx/coroutines/flow/StartedLazily$command$1$1;Lkotlin/coroutines/Continuation;)V PLkotlinx/coroutines/flow/FlowKt__ZipKt$combine$$inlined$combineUnsafe$FlowKt__ZipKt$1$2;->(Lkotlin/coroutines/Continuation;Lkotlin/jvm/functions/Function4;I)V PLkotlinx/coroutines/flow/FlowKt__ZipKt$combine$$inlined$combineUnsafe$FlowKt__ZipKt$1$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLkotlinx/coroutines/flow/FlowKt__ZipKt$combine$$inlined$combineUnsafe$FlowKt__ZipKt$1$2;->invoke(Lkotlinx/coroutines/flow/FlowCollector;[Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLkotlinx/coroutines/flow/FlowKt__ZipKt$combine$$inlined$combineUnsafe$FlowKt__ZipKt$1$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLkotlinx/coroutines/flow/FlowKt__ZipKt$combine$$inlined$unsafeFlow$1;->(Lkotlinx/coroutines/flow/Flow;Ljava/lang/Object;Ljava/lang/Object;I)V PLkotlinx/coroutines/flow/FlowKt__ZipKt$combine$$inlined$unsafeFlow$1;->collect(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLkotlinx/coroutines/flow/FlowKt__ZipKt$combine$1$1;->(Ljava/lang/Object;Lkotlin/coroutines/Continuation;I)V PLkotlinx/coroutines/flow/FlowKt__ZipKt$combineTransform$$inlined$combineTransformUnsafe$FlowKt__ZipKt$1;->([Lkotlinx/coroutines/flow/Flow;Lkotlin/coroutines/Continuation;Lkotlin/jvm/functions/Function4;)V PLkotlinx/coroutines/flow/FlowKt__ZipKt$combineTransform$$inlined$combineTransformUnsafe$FlowKt__ZipKt$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLkotlinx/coroutines/flow/FlowKt__ZipKt$combineTransform$$inlined$combineTransformUnsafe$FlowKt__ZipKt$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLkotlinx/coroutines/flow/FlowKt__ZipKt$nullArrayFactory$1;->()V PLkotlinx/coroutines/flow/FlowKt__ZipKt$nullArrayFactory$1;->(I)V PLkotlinx/coroutines/flow/FlowKt__ZipKt$nullArrayFactory$1;->invoke()Landroidx/window/extensions/layout/WindowLayoutComponent; PLkotlinx/coroutines/flow/FlowKt__ZipKt$nullArrayFactory$1;->invoke()Ljava/lang/Object; PLkotlinx/coroutines/flow/ReadonlySharedFlow;->(Lkotlinx/coroutines/flow/SharedFlow;Lkotlinx/coroutines/Job;)V PLkotlinx/coroutines/flow/ReadonlySharedFlow;->collect(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLkotlinx/coroutines/flow/ReadonlyStateFlow;->(Lkotlinx/coroutines/flow/StateFlow;Lkotlinx/coroutines/Job;)V PLkotlinx/coroutines/flow/ReadonlyStateFlow;->collect(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLkotlinx/coroutines/flow/SafeFlow;->(Lkotlin/jvm/functions/Function2;)V PLkotlinx/coroutines/flow/SharedFlowImpl$collect$1;->(Lkotlinx/coroutines/flow/SharedFlowImpl;Lkotlin/coroutines/Continuation;)V PLkotlinx/coroutines/flow/SharedFlowImpl;->(IILkotlinx/coroutines/channels/BufferOverflow;)V PLkotlinx/coroutines/flow/SharedFlowImpl;->collect(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLkotlinx/coroutines/flow/SharedFlowImpl;->createSlot()Lkotlinx/coroutines/flow/internal/AbstractSharedFlowSlot; PLkotlinx/coroutines/flow/SharedFlowImpl;->createSlotArray(I)[Lkotlinx/coroutines/flow/internal/AbstractSharedFlowSlot; PLkotlinx/coroutines/flow/SharedFlowImpl;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLkotlinx/coroutines/flow/SharedFlowImpl;->growBuffer([Ljava/lang/Object;II)[Ljava/lang/Object; PLkotlinx/coroutines/flow/SharedFlowSlot;->()V PLkotlinx/coroutines/flow/SharedFlowSlot;->allocateLocked(Ljava/lang/Object;)Z PLkotlinx/coroutines/flow/SharedFlowSlot;->freeLocked(Ljava/lang/Object;)[Lkotlin/coroutines/Continuation; PLkotlinx/coroutines/flow/SharingCommand;->()V PLkotlinx/coroutines/flow/SharingCommand;->(Ljava/lang/String;I)V PLkotlinx/coroutines/flow/StartedLazily$command$1$1;->(Ljava/lang/Object;Ljava/lang/Object;I)V PLkotlinx/coroutines/flow/StartedLazily$command$1$1;->(Lkotlinx/coroutines/flow/FlowCollector;Ljava/lang/Object;I)V PLkotlinx/coroutines/flow/StartedLazily;->(I)V PLkotlinx/coroutines/flow/StartedWhileSubscribed$command$2;->(Lkotlin/coroutines/Continuation;)V PLkotlinx/coroutines/flow/StartedWhileSubscribed$command$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLkotlinx/coroutines/flow/StartedWhileSubscribed$command$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLkotlinx/coroutines/flow/StartedWhileSubscribed;->(JJ)V PLkotlinx/coroutines/flow/StartedWhileSubscribed;->command(Lkotlinx/coroutines/flow/StateFlow;)Lkotlinx/coroutines/flow/Flow; PLkotlinx/coroutines/flow/StartedWhileSubscribed;->equals(Ljava/lang/Object;)Z PLkotlinx/coroutines/flow/StateFlowImpl;->(Ljava/lang/Object;)V PLkotlinx/coroutines/flow/StateFlowImpl;->createSlot()Lkotlinx/coroutines/flow/internal/AbstractSharedFlowSlot; PLkotlinx/coroutines/flow/StateFlowImpl;->createSlotArray(I)[Lkotlinx/coroutines/flow/internal/AbstractSharedFlowSlot; PLkotlinx/coroutines/flow/StateFlowImpl;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLkotlinx/coroutines/flow/StateFlowImpl;->setValue(Ljava/lang/Object;)V PLkotlinx/coroutines/flow/StateFlowSlot;->()V PLkotlinx/coroutines/flow/StateFlowSlot;->()V PLkotlinx/coroutines/flow/internal/AbortFlowException;->(Lkotlinx/coroutines/flow/FlowCollector;)V PLkotlinx/coroutines/flow/internal/AbortFlowException;->fillInStackTrace()Ljava/lang/Throwable; PLkotlinx/coroutines/flow/internal/AbstractSharedFlow;->()V PLkotlinx/coroutines/flow/internal/AbstractSharedFlow;->getSubscriptionCount()Lkotlinx/coroutines/flow/StateFlow; PLkotlinx/coroutines/flow/internal/AbstractSharedFlowSlot;->()V PLkotlinx/coroutines/flow/internal/ChannelFlow$collect$2;->(Lkotlinx/coroutines/flow/FlowCollector;Lkotlinx/coroutines/flow/internal/ChannelFlow;Lkotlin/coroutines/Continuation;)V PLkotlinx/coroutines/flow/internal/ChannelFlow;->dropChannelOperators()Lkotlinx/coroutines/flow/Flow; PLkotlinx/coroutines/flow/internal/ChannelFlow;->fuse(Lkotlin/coroutines/CoroutineContext;ILkotlinx/coroutines/channels/BufferOverflow;)Lkotlinx/coroutines/flow/Flow; PLkotlinx/coroutines/flow/internal/ChannelFlowMerge$collectTo$2$1;->(Lkotlinx/coroutines/flow/Flow;Lkotlinx/coroutines/flow/internal/SendingCollector;Lkotlinx/coroutines/sync/Semaphore;Lkotlin/coroutines/Continuation;)V PLkotlinx/coroutines/flow/internal/ChannelFlowMerge$collectTo$2$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; PLkotlinx/coroutines/flow/internal/ChannelFlowMerge$collectTo$2$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLkotlinx/coroutines/flow/internal/ChannelFlowMerge$collectTo$2$emit$1;->(Lkotlinx/coroutines/flow/internal/ChannelFlowMerge$collectTo$2;Lkotlin/coroutines/Continuation;)V PLkotlinx/coroutines/flow/internal/ChannelFlowMerge$collectTo$2;->(Lkotlinx/coroutines/Job;Lkotlinx/coroutines/sync/Semaphore;Lkotlinx/coroutines/channels/ProducerScope;Lkotlinx/coroutines/flow/internal/SendingCollector;)V PLkotlinx/coroutines/flow/internal/ChannelFlowMerge$collectTo$2;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLkotlinx/coroutines/flow/internal/ChannelFlowMerge$collectTo$2;->emit(Lkotlinx/coroutines/flow/Flow;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLkotlinx/coroutines/flow/internal/ChannelFlowMerge;->(Lkotlinx/coroutines/flow/Flow;ILkotlin/coroutines/CoroutineContext;ILkotlinx/coroutines/channels/BufferOverflow;I)V PLkotlinx/coroutines/flow/internal/ChannelFlowMerge;->collectTo(Lkotlinx/coroutines/channels/ProducerScope;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLkotlinx/coroutines/flow/internal/ChannelFlowMerge;->produceImpl(Lkotlinx/coroutines/CoroutineScope;)Lkotlinx/coroutines/channels/ReceiveChannel; PLkotlinx/coroutines/flow/internal/ChannelFlowOperator;->(Lkotlinx/coroutines/flow/Flow;Lkotlin/coroutines/CoroutineContext;ILkotlinx/coroutines/channels/BufferOverflow;)V PLkotlinx/coroutines/flow/internal/ChannelFlowOperatorImpl;->(Lkotlinx/coroutines/flow/Flow;Lkotlin/coroutines/CoroutineContext;ILkotlinx/coroutines/channels/BufferOverflow;I)V PLkotlinx/coroutines/flow/internal/ChannelFlowOperatorImpl;->flowCollect(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLkotlinx/coroutines/flow/internal/ChannelFlowTransformLatest$flowCollect$3$1$emit$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLkotlinx/coroutines/flow/internal/ChannelFlowTransformLatest$flowCollect$3;->(Lkotlinx/coroutines/flow/internal/ChannelFlowTransformLatest;Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)V PLkotlinx/coroutines/flow/internal/ChannelFlowTransformLatest;->(Lkotlin/jvm/functions/Function3;Lkotlinx/coroutines/flow/Flow;Lkotlin/coroutines/CoroutineContext;ILkotlinx/coroutines/channels/BufferOverflow;)V PLkotlinx/coroutines/flow/internal/ChannelFlowTransformLatest;->(Lkotlin/jvm/functions/Function3;Lkotlinx/coroutines/flow/Flow;Lkotlin/coroutines/CoroutineContext;ILkotlinx/coroutines/channels/BufferOverflow;I)V PLkotlinx/coroutines/flow/internal/ChannelFlowTransformLatest;->create(Lkotlin/coroutines/CoroutineContext;ILkotlinx/coroutines/channels/BufferOverflow;)Lkotlinx/coroutines/flow/internal/ChannelFlow; PLkotlinx/coroutines/flow/internal/ChannelFlowTransformLatest;->flowCollect(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLkotlinx/coroutines/flow/internal/ChildCancelledException;->fillInStackTrace()Ljava/lang/Throwable; PLkotlinx/coroutines/flow/internal/CombineKt$combineInternal$2$1$1$emit$1;->(Lkotlinx/coroutines/flow/internal/CombineKt$combineInternal$2$1$1;Lkotlin/coroutines/Continuation;)V PLkotlinx/coroutines/flow/internal/CombineKt$combineInternal$2$1$1$emit$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLkotlinx/coroutines/flow/internal/CombineKt$combineInternal$2$1$1;->(Lkotlinx/coroutines/channels/Channel;I)V PLkotlinx/coroutines/flow/internal/CombineKt$combineInternal$2$1;->([Lkotlinx/coroutines/flow/Flow;ILjava/util/concurrent/atomic/AtomicInteger;Lkotlinx/coroutines/channels/Channel;Lkotlin/coroutines/Continuation;)V PLkotlinx/coroutines/flow/internal/CombineKt$combineInternal$2$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; PLkotlinx/coroutines/flow/internal/CombineKt$combineInternal$2$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLkotlinx/coroutines/flow/internal/CombineKt$combineInternal$2;->([Lkotlinx/coroutines/flow/Flow;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function3;Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)V PLkotlinx/coroutines/flow/internal/CombineKt$combineInternal$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLkotlinx/coroutines/flow/internal/DownstreamExceptionElement;->()V PLkotlinx/coroutines/flow/internal/DownstreamExceptionElement;->(Ljava/lang/Throwable;)V PLkotlinx/coroutines/flow/internal/FlowCoroutine;->(Lkotlin/coroutines/CoroutineContext;Lkotlin/coroutines/Continuation;)V PLkotlinx/coroutines/flow/internal/FlowCoroutine;->childCancelled(Ljava/lang/Throwable;)Z PLkotlinx/coroutines/flow/internal/NoOpContinuation;->()V PLkotlinx/coroutines/flow/internal/NoOpContinuation;->()V PLkotlinx/coroutines/flow/internal/NopCollector;->()V PLkotlinx/coroutines/flow/internal/NopCollector;->()V PLkotlinx/coroutines/flow/internal/NopCollector;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLkotlinx/coroutines/flow/internal/SafeCollector;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLkotlinx/coroutines/flow/internal/SafeCollector;->getContext()Lkotlin/coroutines/CoroutineContext; PLkotlinx/coroutines/flow/internal/SafeCollector;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLkotlinx/coroutines/flow/internal/SafeCollector;->releaseIntercepted()V PLkotlinx/coroutines/flow/internal/SafeCollectorKt$emitFun$1;->()V PLkotlinx/coroutines/flow/internal/SafeCollectorKt$emitFun$1;->()V PLkotlinx/coroutines/flow/internal/SafeCollectorKt$emitFun$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLkotlinx/coroutines/flow/internal/SafeCollectorKt;->()V PLkotlinx/coroutines/flow/internal/SendingCollector;->(Lkotlinx/coroutines/channels/SendChannel;)V PLkotlinx/coroutines/flow/internal/SubscriptionCountStateFlow;->(I)V PLkotlinx/coroutines/internal/AtomicOp;->()V PLkotlinx/coroutines/internal/ConcurrentKt;->()V PLkotlinx/coroutines/internal/ConcurrentLinkedListNode;->()V PLkotlinx/coroutines/internal/ConcurrentLinkedListNode;->(Lkotlinx/coroutines/internal/ConcurrentLinkedListNode;)V PLkotlinx/coroutines/internal/ContextScope;->(Lkotlin/coroutines/CoroutineContext;)V PLkotlinx/coroutines/internal/ContextScope;->getCoroutineContext()Lkotlin/coroutines/CoroutineContext; PLkotlinx/coroutines/internal/DispatchedContinuation;->()V PLkotlinx/coroutines/internal/DispatchedContinuation;->getDelegate$kotlinx_coroutines_core()Lkotlin/coroutines/Continuation; PLkotlinx/coroutines/internal/DispatchedContinuation;->postponeCancellation(Ljava/lang/Throwable;)Z PLkotlinx/coroutines/internal/LimitedDispatcher;->(Lkotlinx/coroutines/CoroutineDispatcher;I)V PLkotlinx/coroutines/internal/LimitedDispatcher;->dispatch(Lkotlin/coroutines/CoroutineContext;Ljava/lang/Runnable;)V PLkotlinx/coroutines/internal/LimitedDispatcher;->run()V PLkotlinx/coroutines/internal/LimitedDispatcher;->tryAllocateWorker()Z PLkotlinx/coroutines/internal/LockFreeLinkedListNode;->()V PLkotlinx/coroutines/internal/LockFreeTaskQueue;->()V PLkotlinx/coroutines/internal/LockFreeTaskQueue;->(Z)V PLkotlinx/coroutines/internal/LockFreeTaskQueue;->getSize()I PLkotlinx/coroutines/internal/LockFreeTaskQueueCore;->()V PLkotlinx/coroutines/internal/LockFreeTaskQueueCore;->(IZ)V PLkotlinx/coroutines/internal/LockFreeTaskQueueCore;->getSize()I PLkotlinx/coroutines/internal/MainDispatcherLoader;->()V PLkotlinx/coroutines/internal/ScopeCoroutine;->afterCompletion(Ljava/lang/Object;)V PLkotlinx/coroutines/internal/ScopeCoroutine;->afterResume(Ljava/lang/Object;)V PLkotlinx/coroutines/internal/ScopeCoroutine;->isScopedCoroutine()Z PLkotlinx/coroutines/internal/Segment;->()V PLkotlinx/coroutines/internal/Segment;->(JLkotlinx/coroutines/internal/Segment;I)V PLkotlinx/coroutines/internal/Symbol;->(Ljava/lang/String;)V PLkotlinx/coroutines/internal/SystemPropsKt__SystemPropsKt;->()V PLkotlinx/coroutines/internal/ThreadContextKt;->()V PLkotlinx/coroutines/scheduling/CoroutineScheduler$Worker;->()V PLkotlinx/coroutines/scheduling/CoroutineScheduler$Worker;->(Lkotlinx/coroutines/scheduling/CoroutineScheduler;I)V PLkotlinx/coroutines/scheduling/CoroutineScheduler$Worker;->setIndexInArray(I)V PLkotlinx/coroutines/scheduling/CoroutineScheduler;->()V PLkotlinx/coroutines/scheduling/CoroutineScheduler;->(IIJLjava/lang/String;)V PLkotlinx/coroutines/scheduling/CoroutineScheduler;->createNewWorker()I PLkotlinx/coroutines/scheduling/CoroutineScheduler;->runSafely(Lkotlinx/coroutines/scheduling/Task;)V PLkotlinx/coroutines/scheduling/CoroutineScheduler;->tryCreateWorker(J)Z PLkotlinx/coroutines/scheduling/DefaultIoScheduler;->()V PLkotlinx/coroutines/scheduling/DefaultIoScheduler;->()V PLkotlinx/coroutines/scheduling/DefaultIoScheduler;->dispatch(Lkotlin/coroutines/CoroutineContext;Ljava/lang/Runnable;)V PLkotlinx/coroutines/scheduling/DefaultScheduler;->()V PLkotlinx/coroutines/scheduling/DefaultScheduler;->()V PLkotlinx/coroutines/scheduling/GlobalQueue;->()V PLkotlinx/coroutines/scheduling/NanoTimeSource;->()V PLkotlinx/coroutines/scheduling/NanoTimeSource;->()V PLkotlinx/coroutines/scheduling/SchedulerCoroutineDispatcher;->(IIJLjava/lang/String;)V PLkotlinx/coroutines/scheduling/Task;->(JLorg/threeten/bp/chrono/Chronology$1;)V PLkotlinx/coroutines/scheduling/TaskImpl;->(Ljava/lang/Runnable;JLorg/threeten/bp/chrono/Chronology$1;)V PLkotlinx/coroutines/scheduling/TaskImpl;->run()V PLkotlinx/coroutines/scheduling/TasksKt;->()V PLkotlinx/coroutines/scheduling/UnlimitedIoScheduler;->()V PLkotlinx/coroutines/scheduling/UnlimitedIoScheduler;->()V PLkotlinx/coroutines/scheduling/UnlimitedIoScheduler;->dispatch(Lkotlin/coroutines/CoroutineContext;Ljava/lang/Runnable;)V PLkotlinx/coroutines/scheduling/WorkQueue;->()V PLkotlinx/coroutines/scheduling/WorkQueue;->()V PLkotlinx/coroutines/scheduling/WorkQueue;->addLast(Lkotlinx/coroutines/scheduling/Task;)Lkotlinx/coroutines/scheduling/Task; PLkotlinx/coroutines/scheduling/WorkQueue;->getBufferSize$kotlinx_coroutines_core()I PLkotlinx/coroutines/sync/Empty;->(Ljava/lang/Object;)V PLkotlinx/coroutines/sync/MutexImpl;->()V PLkotlinx/coroutines/sync/MutexImpl;->(Z)V PLkotlinx/coroutines/sync/MutexImpl;->lock(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLkotlinx/coroutines/sync/MutexImpl;->tryLock(Ljava/lang/Object;)Z PLkotlinx/coroutines/sync/MutexImpl;->unlock(Ljava/lang/Object;)V PLkotlinx/coroutines/sync/SemaphoreImpl;->()V PLkotlinx/coroutines/sync/SemaphoreImpl;->(II)V PLkotlinx/coroutines/sync/SemaphoreImpl;->acquire(Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLkotlinx/coroutines/sync/SemaphoreKt;->()V PLkotlinx/coroutines/sync/SemaphoreSegment;->(JLkotlinx/coroutines/sync/SemaphoreSegment;I)V PLokhttp3/CertificatePinner$Builder;->(I)V PLokhttp3/ConnectionPool$1;->(Ljava/lang/Object;I)V PLokhttp3/ConnectionPool$1;->run()V PLokhttp3/ConnectionSpec$Builder;->()V PLokhttp3/Dns$1;->()V PLokhttp3/Dns$1;->()V PLokhttp3/Headers$Builder;->(I)V PLokhttp3/Request$Builder;->(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)V PLokhttp3/RequestBody;->()V PLokhttp3/RequestBody;->()V PLokhttp3/RequestBody;->assertInstantiable(Ljava/lang/Class;)V PLokhttp3/RequestBody;->bytesToStringUppercase([BZ)Ljava/lang/String; PLokhttp3/RequestBody;->closeOrLog(Ljava/io/Closeable;Ljava/lang/String;)V PLokhttp3/RequestBody;->convertMemInfoToBytes(Ljava/lang/String;Ljava/lang/String;I)J PLokhttp3/RequestBody;->createInstanceIdFrom([Ljava/lang/String;)Ljava/lang/String; PLokhttp3/RequestBody;->extractFieldFromSystemFile(Ljava/io/File;Ljava/lang/String;)Ljava/lang/String; PLokhttp3/RequestBody;->flushOrLog(Ljava/io/Flushable;Ljava/lang/String;)V PLokhttp3/RequestBody;->getBooleanResourceValue(Landroid/content/Context;Ljava/lang/String;Z)Z PLokhttp3/RequestBody;->getColor(Landroid/content/Context;II)I PLokhttp3/RequestBody;->getDeviceState(Landroid/content/Context;)I PLokhttp3/RequestBody;->getMappingFileId(Landroid/content/Context;)Ljava/lang/String; PLokhttp3/RequestBody;->getResourcesIdentifier(Landroid/content/Context;Ljava/lang/String;Ljava/lang/String;)I PLokhttp3/RequestBody;->getSharedPrefs(Landroid/content/Context;)Landroid/content/SharedPreferences; PLokhttp3/RequestBody;->getTotalRamInBytes()J PLokhttp3/RequestBody;->hexify([B)Ljava/lang/String; PLokhttp3/RequestBody;->isEmulator(Landroid/content/Context;)Z PLokhttp3/RequestBody;->isNullOrEmpty(Ljava/lang/String;)Z PLokhttp3/RequestBody;->isRooted(Landroid/content/Context;)Z PLokhttp3/RequestBody;->matchDestination$navigation_ui_release(Landroidx/navigation/NavDestination;I)Z PLokhttp3/RequestBody;->sha1(Ljava/lang/String;)Ljava/lang/String; PLokhttp3/internal/Util$1;->(I)V PLokhttp3/internal/Util$1;->compare(Landroid/view/View;Landroid/view/View;)I PLokhttp3/internal/Util$1;->compare(Ljava/io/File;Ljava/io/File;)I PLokhttp3/internal/Util$1;->compare(Ljava/lang/Object;Ljava/lang/Object;)I PLokhttp3/internal/connection/RouteDatabase;->(I)V PLokhttp3/internal/connection/RouteSelector$Selection;->()V PLokhttp3/internal/http/HttpDate$1;->(I)V PLokhttp3/internal/http/HttpDate$1;->initialValue()Ljava/lang/Object; PLokhttp3/internal/http/StatusLine;->(I[Lcom/google/firebase/crashlytics/internal/stacktrace/StackTraceTrimmingStrategy;)V PLokhttp3/internal/http/StatusLine;->(Lcom/bumptech/glide/load/engine/Engine$LazyDiskCacheProvider;)V PLokhttp3/internal/http/StatusLine;->build(Lcom/bumptech/glide/GlideContext;Ljava/lang/Object;Lcom/bumptech/glide/load/engine/EngineKey;Lcom/bumptech/glide/load/Key;IILjava/lang/Class;Ljava/lang/Class;Lcom/bumptech/glide/Priority;Lcom/bumptech/glide/load/engine/DiskCacheStrategy;Ljava/util/Map;ZZZLcom/bumptech/glide/load/Options;Lcom/bumptech/glide/load/engine/DecodeJob$Callback;)Lcom/bumptech/glide/load/engine/DecodeJob; PLokhttp3/internal/http2/Huffman$Node;->(I)V PLokhttp3/internal/http2/Huffman$Node;->(IILjava/util/Map;)V PLokhttp3/internal/http2/Huffman$Node;->zza()Z PLokhttp3/internal/platform/AndroidPlatform$CloseGuard;->(Ljava/lang/reflect/Method;Ljava/lang/reflect/Method;Ljava/lang/reflect/Method;)V PLokio/Base64;->()V PLokio/Base64;->call(Ljava/util/concurrent/Executor;Ljava/util/concurrent/Callable;)Lcom/google/android/gms/tasks/Task; PLokio/Base64;->checkElementNotNull(Ljava/lang/Object;I)Ljava/lang/Object; PLokio/Base64;->createCornerTreatment(I)Landroidx/core/R$dimen; PLokio/Base64;->createDefaultEdgeTreatment()Landroidx/compose/material/Strings$Companion; PLokio/Base64;->forResult(Ljava/lang/Object;)Lcom/google/android/gms/tasks/Task; PLokio/Base64;->generateDexKey(Ljava/lang/String;Ljava/lang/String;[B)Ljava/lang/String; PLokio/Base64;->getColorStateList(Landroid/content/Context;Landroid/content/res/TypedArray;I)Landroid/content/res/ColorStateList; PLokio/Base64;->getColorStateList(Landroid/content/Context;Lcom/google/firebase/iid/zzk;I)Landroid/content/res/ColorStateList; PLokio/Base64;->getData(Lcom/google/samples/apps/iosched/shared/result/Result;)Ljava/lang/Object; PLokio/Base64;->getDrawable(Landroid/content/Context;Landroid/content/res/TypedArray;I)Landroid/graphics/drawable/Drawable; PLokio/Base64;->parseColor(Ljava/lang/String;)I PLokio/Base64;->readClasses(Ljava/io/InputStream;I)[I PLokio/Base64;->readHeader(Ljava/io/InputStream;[B)[B PLokio/Base64;->readProfile(Ljava/io/InputStream;[BLjava/lang/String;)[Landroidx/profileinstaller/DexProfileData; PLokio/Base64;->setElevation(Landroid/view/View;F)V PLokio/Base64;->setParentAbsoluteElevation(Landroid/view/View;Lcom/google/android/material/shape/MaterialShapeDrawable;)V PLokio/Base64;->smear(I)I PLokio/Base64;->successOr(Lcom/google/samples/apps/iosched/shared/result/Result;Ljava/lang/Object;)Ljava/lang/Object; PLokio/Base64;->themeFromStorageKey(Ljava/lang/String;)Lcom/google/samples/apps/iosched/model/Theme; PLokio/Base64;->unboxState(Ljava/lang/Object;)Ljava/lang/Object; PLokio/Base64;->writeClasses(Ljava/io/OutputStream;Landroidx/profileinstaller/DexProfileData;)V PLokio/SegmentPool;->()V PLokio/SegmentPool;->()V PLokio/SegmentPool;->MutableStateFlow(Ljava/lang/Object;)Lkotlinx/coroutines/flow/StateFlowImpl; PLokio/SegmentPool;->convert(Lcom/bumptech/glide/load/engine/bitmap_recycle/BitmapPool;Landroid/graphics/drawable/Drawable;II)Lcom/bumptech/glide/load/engine/Resource; PLokio/SegmentPool;->equals(Ljava/lang/Object;Ljava/lang/Object;)Z PLokio/SegmentPool;->safeMultiply(JJ)J PLokio/SegmentPool;->safeToInt(J)I PLorg/threeten/bp/DayOfWeek;->()V PLorg/threeten/bp/DayOfWeek;->(Ljava/lang/String;I)V PLorg/threeten/bp/DayOfWeek;->getValue()I PLorg/threeten/bp/DayOfWeek;->of(I)Lorg/threeten/bp/DayOfWeek; PLorg/threeten/bp/DayOfWeek;->values()[Lorg/threeten/bp/DayOfWeek; PLorg/threeten/bp/Duration;->()V PLorg/threeten/bp/Duration;->(JI)V PLorg/threeten/bp/Duration;->create(JI)Lorg/threeten/bp/Duration; PLorg/threeten/bp/Duration;->ofNanos(J)Lorg/threeten/bp/Duration; PLorg/threeten/bp/Duration;->ofSeconds(J)Lorg/threeten/bp/Duration; PLorg/threeten/bp/Duration;->ofSeconds(JJ)Lorg/threeten/bp/Duration; PLorg/threeten/bp/Instant;->()V PLorg/threeten/bp/Instant;->compareTo(Lorg/threeten/bp/Instant;)I PLorg/threeten/bp/Instant;->now()Lorg/threeten/bp/Instant; PLorg/threeten/bp/Instant;->plus(JJ)Lorg/threeten/bp/Instant; PLorg/threeten/bp/Instant;->plusMillis(J)Lorg/threeten/bp/Instant; PLorg/threeten/bp/LocalDate;->()V PLorg/threeten/bp/LocalDate;->create(ILorg/threeten/bp/Month;I)Lorg/threeten/bp/LocalDate; PLorg/threeten/bp/LocalDate;->get(Lorg/threeten/bp/temporal/TemporalField;)I PLorg/threeten/bp/LocalDate;->getDayOfWeek()Lorg/threeten/bp/DayOfWeek; PLorg/threeten/bp/LocalDate;->isSupported(Lorg/threeten/bp/temporal/TemporalField;)Z PLorg/threeten/bp/LocalDate;->of(III)Lorg/threeten/bp/LocalDate; PLorg/threeten/bp/LocalDate;->of(ILorg/threeten/bp/Month;I)Lorg/threeten/bp/LocalDate; PLorg/threeten/bp/LocalDate;->plus(JLorg/threeten/bp/temporal/TemporalUnit;)Lorg/threeten/bp/LocalDate; PLorg/threeten/bp/LocalDate;->plus(JLorg/threeten/bp/temporal/TemporalUnit;)Lorg/threeten/bp/temporal/Temporal; PLorg/threeten/bp/LocalDate;->with(Lorg/threeten/bp/temporal/TemporalAdjuster;)Lorg/threeten/bp/LocalDate; PLorg/threeten/bp/LocalDateTime;->()V PLorg/threeten/bp/LocalDateTime;->isSupported(Lorg/threeten/bp/temporal/TemporalField;)Z PLorg/threeten/bp/LocalDateTime;->of(Lorg/threeten/bp/LocalDate;Lorg/threeten/bp/LocalTime;)Lorg/threeten/bp/LocalDateTime; PLorg/threeten/bp/LocalDateTime;->plusHours(J)Lorg/threeten/bp/LocalDateTime; PLorg/threeten/bp/LocalTime;->()V PLorg/threeten/bp/LocalTime;->isSupported(Lorg/threeten/bp/temporal/TemporalField;)Z PLorg/threeten/bp/LocalTime;->of(II)Lorg/threeten/bp/LocalTime; PLorg/threeten/bp/Month;->()V PLorg/threeten/bp/Month;->(Ljava/lang/String;I)V PLorg/threeten/bp/Month;->getValue()I PLorg/threeten/bp/Month;->length(Z)I PLorg/threeten/bp/Month;->of(I)Lorg/threeten/bp/Month; PLorg/threeten/bp/Month;->values()[Lorg/threeten/bp/Month; PLorg/threeten/bp/Period;->()V PLorg/threeten/bp/Period;->(III)V PLorg/threeten/bp/ZoneId;->()V PLorg/threeten/bp/ZoneId;->()V PLorg/threeten/bp/ZoneId;->from(Lorg/threeten/bp/temporal/TemporalAccessor;)Lorg/threeten/bp/ZoneId; PLorg/threeten/bp/ZoneId;->of(Ljava/lang/String;)Lorg/threeten/bp/ZoneId; PLorg/threeten/bp/ZoneId;->systemDefault()Lorg/threeten/bp/ZoneId; PLorg/threeten/bp/ZoneOffset;->()V PLorg/threeten/bp/ZoneOffset;->(I)V PLorg/threeten/bp/ZoneOffset;->hashCode()I PLorg/threeten/bp/ZoneOffset;->ofTotalSeconds(I)Lorg/threeten/bp/ZoneOffset; PLorg/threeten/bp/ZoneRegion;->()V PLorg/threeten/bp/ZoneRegion;->(Ljava/lang/String;Lorg/threeten/bp/zone/ZoneRules;)V PLorg/threeten/bp/ZonedDateTime;->()V PLorg/threeten/bp/ZonedDateTime;->from(Lorg/threeten/bp/temporal/TemporalAccessor;)Lorg/threeten/bp/ZonedDateTime; PLorg/threeten/bp/ZonedDateTime;->now()Lorg/threeten/bp/ZonedDateTime; PLorg/threeten/bp/ZonedDateTime;->parse(Ljava/lang/CharSequence;)Lorg/threeten/bp/ZonedDateTime; PLorg/threeten/bp/ZonedDateTime;->plusHours(J)Lorg/threeten/bp/ZonedDateTime; PLorg/threeten/bp/ZonedDateTime;->query(Lorg/threeten/bp/temporal/TemporalQuery;)Ljava/lang/Object; PLorg/threeten/bp/ZonedDateTime;->resolveInstant(Lorg/threeten/bp/LocalDateTime;)Lorg/threeten/bp/ZonedDateTime; PLorg/threeten/bp/chrono/ChronoZonedDateTime;->isAfter(Lorg/threeten/bp/chrono/ChronoZonedDateTime;)Z PLorg/threeten/bp/chrono/ChronoZonedDateTime;->isBefore(Lorg/threeten/bp/chrono/ChronoZonedDateTime;)Z PLorg/threeten/bp/chrono/ChronoZonedDateTime;->query(Lorg/threeten/bp/temporal/TemporalQuery;)Ljava/lang/Object; PLorg/threeten/bp/chrono/Chronology$1;->(I)V PLorg/threeten/bp/chrono/Chronology$1;->(Landroidx/datastore/preferences/protobuf/ByteString$1;I)V PLorg/threeten/bp/chrono/Chronology$1;->queryFrom(Lorg/threeten/bp/temporal/TemporalAccessor;)Ljava/lang/Object; PLorg/threeten/bp/chrono/Chronology$1;->queryFrom(Lorg/threeten/bp/temporal/TemporalAccessor;)Lorg/threeten/bp/ZoneId; PLorg/threeten/bp/chrono/Chronology;->()V PLorg/threeten/bp/chrono/Chronology;->()V PLorg/threeten/bp/chrono/Chronology;->equals(Ljava/lang/Object;)Z PLorg/threeten/bp/chrono/IsoChronology;->()V PLorg/threeten/bp/chrono/IsoChronology;->()V PLorg/threeten/bp/format/DateTimeBuilder;->()V PLorg/threeten/bp/format/DateTimeBuilder;->checkDate(Lorg/threeten/bp/LocalDate;)V PLorg/threeten/bp/format/DateTimeBuilder;->crossCheck(Lorg/threeten/bp/temporal/TemporalAccessor;)V PLorg/threeten/bp/format/DateTimeBuilder;->getLong(Lorg/threeten/bp/temporal/TemporalField;)J PLorg/threeten/bp/format/DateTimeBuilder;->isSupported(Lorg/threeten/bp/temporal/TemporalField;)Z PLorg/threeten/bp/format/DateTimeBuilder;->mergeDate(Lorg/threeten/bp/format/ResolverStyle;)V PLorg/threeten/bp/format/DateTimeBuilder;->mergeInstantFields()V PLorg/threeten/bp/format/DateTimeBuilder;->mergeTime(Lorg/threeten/bp/format/ResolverStyle;)V PLorg/threeten/bp/format/DateTimeBuilder;->query(Lorg/threeten/bp/temporal/TemporalQuery;)Ljava/lang/Object; PLorg/threeten/bp/format/DateTimeFormatter;->()V PLorg/threeten/bp/format/DateTimeFormatter;->parseToBuilder(Ljava/lang/CharSequence;Ljava/text/ParsePosition;)Lorg/threeten/bp/format/DateTimeBuilder; PLorg/threeten/bp/format/DateTimeFormatter;->withChronology(Lorg/threeten/bp/chrono/Chronology;)Lorg/threeten/bp/format/DateTimeFormatter; PLorg/threeten/bp/format/DateTimeFormatterBuilder$2;->(Lorg/threeten/bp/format/DateTimeFormatterBuilder;Lorg/threeten/bp/format/SimpleDateTimeTextProvider$LocaleStore;)V PLorg/threeten/bp/format/DateTimeFormatterBuilder$CharLiteralPrinterParser;->parse(Lorg/threeten/bp/format/DateTimeParseContext;Ljava/lang/CharSequence;I)I PLorg/threeten/bp/format/DateTimeFormatterBuilder$CompositePrinterParser;->parse(Lorg/threeten/bp/format/DateTimeParseContext;Ljava/lang/CharSequence;I)I PLorg/threeten/bp/format/DateTimeFormatterBuilder$FractionPrinterParser;->(Lorg/threeten/bp/temporal/TemporalField;IIZ)V PLorg/threeten/bp/format/DateTimeFormatterBuilder$FractionPrinterParser;->parse(Lorg/threeten/bp/format/DateTimeParseContext;Ljava/lang/CharSequence;I)I PLorg/threeten/bp/format/DateTimeFormatterBuilder$InstantPrinterParser;->(I)V PLorg/threeten/bp/format/DateTimeFormatterBuilder$NumberPrinterParser;->()V PLorg/threeten/bp/format/DateTimeFormatterBuilder$NumberPrinterParser;->(Lorg/threeten/bp/temporal/TemporalField;IIII)V PLorg/threeten/bp/format/DateTimeFormatterBuilder$NumberPrinterParser;->getValue(Lcom/google/firebase/iid/zzab;J)J PLorg/threeten/bp/format/DateTimeFormatterBuilder$NumberPrinterParser;->parse(Lorg/threeten/bp/format/DateTimeParseContext;Ljava/lang/CharSequence;I)I PLorg/threeten/bp/format/DateTimeFormatterBuilder$NumberPrinterParser;->setValue(Lorg/threeten/bp/format/DateTimeParseContext;JII)I PLorg/threeten/bp/format/DateTimeFormatterBuilder$NumberPrinterParser;->withFixedWidth()Lorg/threeten/bp/format/DateTimeFormatterBuilder$NumberPrinterParser; PLorg/threeten/bp/format/DateTimeFormatterBuilder$NumberPrinterParser;->withSubsequentWidth(I)Lorg/threeten/bp/format/DateTimeFormatterBuilder$NumberPrinterParser; PLorg/threeten/bp/format/DateTimeFormatterBuilder$OffsetIdPrinterParser;->()V PLorg/threeten/bp/format/DateTimeFormatterBuilder$OffsetIdPrinterParser;->(Ljava/lang/String;Ljava/lang/String;)V PLorg/threeten/bp/format/DateTimeFormatterBuilder$OffsetIdPrinterParser;->parse(Lorg/threeten/bp/format/DateTimeParseContext;Ljava/lang/CharSequence;I)I PLorg/threeten/bp/format/DateTimeFormatterBuilder$OffsetIdPrinterParser;->parseNumber([IILjava/lang/CharSequence;Z)Z PLorg/threeten/bp/format/DateTimeFormatterBuilder$SettingsParser;->()V PLorg/threeten/bp/format/DateTimeFormatterBuilder$SettingsParser;->(Ljava/lang/String;I)V PLorg/threeten/bp/format/DateTimeFormatterBuilder$SettingsParser;->parse(Lorg/threeten/bp/format/DateTimeParseContext;Ljava/lang/CharSequence;I)I PLorg/threeten/bp/format/DateTimeFormatterBuilder$SettingsParser;->print(Lcom/google/firebase/iid/zzab;Ljava/lang/StringBuilder;)Z PLorg/threeten/bp/format/DateTimeFormatterBuilder$StringLiteralPrinterParser;->(Ljava/lang/Object;I)V PLorg/threeten/bp/format/DateTimeFormatterBuilder$ZoneIdPrinterParser;->(Lorg/threeten/bp/temporal/TemporalQuery;Ljava/lang/String;)V PLorg/threeten/bp/format/DateTimeFormatterBuilder;->()V PLorg/threeten/bp/format/DateTimeFormatterBuilder;->(Lorg/threeten/bp/format/DateTimeFormatterBuilder;Z)V PLorg/threeten/bp/format/DateTimeFormatterBuilder;->append(Lorg/threeten/bp/format/DateTimeFormatter;)Lorg/threeten/bp/format/DateTimeFormatterBuilder; PLorg/threeten/bp/format/DateTimeFormatterBuilder;->appendFraction(Lorg/threeten/bp/temporal/TemporalField;IIZ)Lorg/threeten/bp/format/DateTimeFormatterBuilder; PLorg/threeten/bp/format/DateTimeFormatterBuilder;->appendLiteral(Ljava/lang/String;)Lorg/threeten/bp/format/DateTimeFormatterBuilder; PLorg/threeten/bp/format/DateTimeFormatterBuilder;->appendOffset(Ljava/lang/String;Ljava/lang/String;)Lorg/threeten/bp/format/DateTimeFormatterBuilder; PLorg/threeten/bp/format/DateTimeFormatterBuilder;->appendText(Lorg/threeten/bp/temporal/TemporalField;Ljava/util/Map;)Lorg/threeten/bp/format/DateTimeFormatterBuilder; PLorg/threeten/bp/format/DateTimeFormatterBuilder;->appendValue$enumunboxing$(Lorg/threeten/bp/temporal/TemporalField;III)Lorg/threeten/bp/format/DateTimeFormatterBuilder; PLorg/threeten/bp/format/DateTimeFormatterBuilder;->optionalEnd()Lorg/threeten/bp/format/DateTimeFormatterBuilder; PLorg/threeten/bp/format/DateTimeFormatterBuilder;->optionalStart()Lorg/threeten/bp/format/DateTimeFormatterBuilder; PLorg/threeten/bp/format/DateTimeFormatterBuilder;->toFormatter(Lorg/threeten/bp/format/ResolverStyle;)Lorg/threeten/bp/format/DateTimeFormatter; PLorg/threeten/bp/format/DateTimeParseContext$Parsed;->(Lorg/threeten/bp/format/DateTimeParseContext;)V PLorg/threeten/bp/format/DateTimeParseContext;->(Lorg/threeten/bp/format/DateTimeFormatter;)V PLorg/threeten/bp/format/DateTimeParseContext;->charEquals(CC)Z PLorg/threeten/bp/format/DateTimeParseContext;->currentParsed()Lorg/threeten/bp/format/DateTimeParseContext$Parsed; PLorg/threeten/bp/format/DateTimeParseContext;->endOptional(Z)V PLorg/threeten/bp/format/DateTimeParseContext;->setParsedField(Lorg/threeten/bp/temporal/TemporalField;JII)I PLorg/threeten/bp/format/DateTimeParseContext;->subSequenceEquals(Ljava/lang/CharSequence;ILjava/lang/CharSequence;II)Z PLorg/threeten/bp/format/DateTimeTextProvider$ProviderSingleton;->()V PLorg/threeten/bp/format/DateTimeTextProvider;->()V PLorg/threeten/bp/format/DateTimeTextProvider;->()V PLorg/threeten/bp/format/DecimalStyle;->()V PLorg/threeten/bp/format/DecimalStyle;->(CCCC)V PLorg/threeten/bp/format/ResolverStyle;->()V PLorg/threeten/bp/format/ResolverStyle;->(Ljava/lang/String;I)V PLorg/threeten/bp/format/SimpleDateTimeTextProvider$LocaleStore;->(Ljava/util/Map;)V PLorg/threeten/bp/format/SimpleDateTimeTextProvider;->()V PLorg/threeten/bp/format/SimpleDateTimeTextProvider;->()V PLorg/threeten/bp/format/SimpleDateTimeTextProvider;->createLocaleStore(Ljava/util/Map;)Lorg/threeten/bp/format/SimpleDateTimeTextProvider$LocaleStore; PLorg/threeten/bp/format/TextStyle;->()V PLorg/threeten/bp/format/TextStyle;->(Ljava/lang/String;I)V PLorg/threeten/bp/temporal/ChronoField;->()V PLorg/threeten/bp/temporal/ChronoField;->(Ljava/lang/String;ILjava/lang/String;Lorg/threeten/bp/temporal/TemporalUnit;Lorg/threeten/bp/temporal/TemporalUnit;Lorg/threeten/bp/temporal/ValueRange;)V PLorg/threeten/bp/temporal/ChronoField;->isDateBased()Z PLorg/threeten/bp/temporal/ChronoField;->range()Lorg/threeten/bp/temporal/ValueRange; PLorg/threeten/bp/temporal/ChronoField;->resolve(Ljava/util/Map;Lorg/threeten/bp/temporal/TemporalAccessor;Lorg/threeten/bp/format/ResolverStyle;)Lorg/threeten/bp/temporal/TemporalAccessor; PLorg/threeten/bp/temporal/ChronoUnit;->()V PLorg/threeten/bp/temporal/ChronoUnit;->(Ljava/lang/String;ILjava/lang/String;Lorg/threeten/bp/Duration;)V PLorg/threeten/bp/temporal/IsoFields$Field$1;->(Ljava/lang/String;I)V PLorg/threeten/bp/temporal/IsoFields$Field$2;->(Ljava/lang/String;I)V PLorg/threeten/bp/temporal/IsoFields$Field$3;->(Ljava/lang/String;I)V PLorg/threeten/bp/temporal/IsoFields$Field$4;->(Ljava/lang/String;I)V PLorg/threeten/bp/temporal/IsoFields$Field;->()V PLorg/threeten/bp/temporal/IsoFields$Field;->(Ljava/lang/String;ILandroidx/appcompat/R$bool;)V PLorg/threeten/bp/temporal/IsoFields$Unit;->()V PLorg/threeten/bp/temporal/IsoFields$Unit;->(Ljava/lang/String;ILjava/lang/String;Lorg/threeten/bp/Duration;)V PLorg/threeten/bp/temporal/IsoFields;->()V PLorg/threeten/bp/temporal/ValueRange;->(JJJJ)V PLorg/threeten/bp/temporal/ValueRange;->of(JJ)Lorg/threeten/bp/temporal/ValueRange; PLorg/threeten/bp/temporal/ValueRange;->of(JJJ)Lorg/threeten/bp/temporal/ValueRange; PLorg/threeten/bp/temporal/ValueRange;->of(JJJJ)Lorg/threeten/bp/temporal/ValueRange; PLorg/threeten/bp/zone/Ser;->readEpochSec(Ljava/io/DataInput;)J PLorg/threeten/bp/zone/Ser;->readOffset(Ljava/io/DataInput;)Lorg/threeten/bp/ZoneOffset; PLorg/threeten/bp/zone/StandardZoneRules;->([J[Lorg/threeten/bp/ZoneOffset;[J[Lorg/threeten/bp/ZoneOffset;[Lorg/threeten/bp/zone/ZoneOffsetTransitionRule;)V PLorg/threeten/bp/zone/TzdbZoneRulesProvider$Version;->(Ljava/lang/String;[Ljava/lang/String;[SLjava/util/concurrent/atomic/AtomicReferenceArray;)V PLorg/threeten/bp/zone/TzdbZoneRulesProvider$Version;->createRule(S)Lorg/threeten/bp/zone/ZoneRules; PLorg/threeten/bp/zone/TzdbZoneRulesProvider;->()V PLorg/threeten/bp/zone/TzdbZoneRulesProvider;->(Ljava/io/InputStream;)V PLorg/threeten/bp/zone/TzdbZoneRulesProvider;->getRules(Ljava/lang/String;Z)Lorg/threeten/bp/zone/ZoneRules; PLorg/threeten/bp/zone/TzdbZoneRulesProvider;->load(Ljava/io/InputStream;)Z PLorg/threeten/bp/zone/TzdbZoneRulesProvider;->registerProvider(Lorg/threeten/bp/zone/TzdbZoneRulesProvider;)V PLorg/threeten/bp/zone/ZoneOffsetTransition;->(Lorg/threeten/bp/LocalDateTime;Lorg/threeten/bp/ZoneOffset;Lorg/threeten/bp/ZoneOffset;)V PLorg/threeten/bp/zone/ZoneOffsetTransitionRule;->(Lorg/threeten/bp/Month;ILorg/threeten/bp/DayOfWeek;Lorg/threeten/bp/LocalTime;ZILorg/threeten/bp/ZoneOffset;Lorg/threeten/bp/ZoneOffset;Lorg/threeten/bp/ZoneOffset;)V PLorg/threeten/bp/zone/ZoneOffsetTransitionRule;->readExternal(Ljava/io/DataInput;)Lorg/threeten/bp/zone/ZoneOffsetTransitionRule; PLorg/threeten/bp/zone/ZoneRulesInitializer$ServiceLoaderZoneRulesInitializer;->()V PLorg/threeten/bp/zone/ZoneRulesInitializer$ServiceLoaderZoneRulesInitializer;->initializeProviders()V PLorg/threeten/bp/zone/ZoneRulesInitializer;->()V PLorg/threeten/bp/zone/ZoneRulesInitializer;->()V PLtimber/log/Timber$Forest;->(Lkotlin/LazyKt__LazyKt;)V PLtimber/log/Timber$Forest;->d(Ljava/lang/String;[Ljava/lang/Object;)V PLtimber/log/Timber$Tree;->()V PLtimber/log/Timber$Tree;->d(Ljava/lang/String;[Ljava/lang/Object;)V PLtimber/log/Timber$Tree;->prepareLog(ILjava/lang/Throwable;Ljava/lang/String;[Ljava/lang/Object;)V PLtimber/log/Timber;->()V ================================================ FILE: mobile/src/main/java/com/google/samples/apps/iosched/MainApplication.kt ================================================ /* * Copyright 2018 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched import android.app.Application import dagger.hilt.android.HiltAndroidApp @HiltAndroidApp class MainApplication : Application() ================================================ FILE: mobile/src/main/java/com/google/samples/apps/iosched/di/AppModule.kt ================================================ /* * Copyright 2018 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.di import android.content.ClipboardManager import android.content.Context import android.net.ConnectivityManager import android.net.wifi.WifiManager import com.google.gson.Gson import com.google.gson.GsonBuilder import com.google.samples.apps.iosched.shared.analytics.AnalyticsHelper import com.google.samples.apps.iosched.shared.data.agenda.AgendaRepository import com.google.samples.apps.iosched.shared.data.agenda.DefaultAgendaRepository import com.google.samples.apps.iosched.shared.data.config.AppConfigDataSource import com.google.samples.apps.iosched.shared.data.db.AppDatabase import com.google.samples.apps.iosched.shared.data.prefs.PreferenceStorage import com.google.samples.apps.iosched.shared.di.ApplicationScope import com.google.samples.apps.iosched.shared.di.DefaultDispatcher import com.google.samples.apps.iosched.shared.di.MainThreadHandler import com.google.samples.apps.iosched.shared.domain.internal.IOSchedHandler import com.google.samples.apps.iosched.shared.domain.internal.IOSchedMainHandler import com.google.samples.apps.iosched.ui.signin.SignInViewModelDelegate import com.google.samples.apps.iosched.util.FirebaseAnalyticsHelper import dagger.Module import dagger.Provides import dagger.hilt.InstallIn import dagger.hilt.android.qualifiers.ApplicationContext import dagger.hilt.components.SingletonComponent import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.SupervisorJob import javax.inject.Singleton /** * Defines all the classes that need to be provided in the scope of the app. * * Define here all objects that are shared throughout the app, like SharedPreferences, navigators or * others. If some of those objects are singletons, they should be annotated with `@Singleton`. */ @InstallIn(SingletonComponent::class) @Module class AppModule { @Provides fun provideWifiManager(@ApplicationContext context: Context): WifiManager = context.applicationContext.getSystemService(Context.WIFI_SERVICE) as WifiManager @Provides fun provideConnectivityManager(@ApplicationContext context: Context): ConnectivityManager = context.applicationContext.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager @Provides fun provideClipboardManager(@ApplicationContext context: Context): ClipboardManager = context.applicationContext.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager @ApplicationScope @Singleton @Provides fun providesApplicationScope( @DefaultDispatcher defaultDispatcher: CoroutineDispatcher ): CoroutineScope = CoroutineScope(SupervisorJob() + defaultDispatcher) @Singleton @Provides @MainThreadHandler fun provideMainThreadHandler(): IOSchedHandler = IOSchedMainHandler() @Singleton @Provides fun provideAnalyticsHelper( @ApplicationScope applicationScope: CoroutineScope, signInDelegate: SignInViewModelDelegate, preferenceStorage: PreferenceStorage ): AnalyticsHelper = FirebaseAnalyticsHelper(applicationScope, signInDelegate, preferenceStorage) @Singleton @Provides fun provideAgendaRepository(appConfigDataSource: AppConfigDataSource): AgendaRepository = DefaultAgendaRepository(appConfigDataSource) @Singleton @Provides fun provideAppDatabase(@ApplicationContext context: Context): AppDatabase { return AppDatabase.buildDatabase(context) } @Singleton @Provides fun provideGson(): Gson { return GsonBuilder().create() } } ================================================ FILE: mobile/src/main/java/com/google/samples/apps/iosched/di/CoroutinesModule.kt ================================================ /* * Copyright 2019 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.di import com.google.samples.apps.iosched.shared.di.DefaultDispatcher import com.google.samples.apps.iosched.shared.di.IoDispatcher import com.google.samples.apps.iosched.shared.di.MainDispatcher import com.google.samples.apps.iosched.shared.di.MainImmediateDispatcher import dagger.Module import dagger.Provides import dagger.hilt.InstallIn import dagger.hilt.components.SingletonComponent import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.Dispatchers @InstallIn(SingletonComponent::class) @Module object CoroutinesModule { @DefaultDispatcher @Provides fun providesDefaultDispatcher(): CoroutineDispatcher = Dispatchers.Default @IoDispatcher @Provides fun providesIoDispatcher(): CoroutineDispatcher = Dispatchers.IO @MainDispatcher @Provides fun providesMainDispatcher(): CoroutineDispatcher = Dispatchers.Main @MainImmediateDispatcher @Provides fun providesMainImmediateDispatcher(): CoroutineDispatcher = Dispatchers.Main.immediate } ================================================ FILE: mobile/src/main/java/com/google/samples/apps/iosched/di/PreferencesStorageModule.kt ================================================ /* * Copyright 2021 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.di import android.content.Context import androidx.datastore.preferences.SharedPreferencesMigration import androidx.datastore.preferences.preferencesDataStore import com.google.samples.apps.iosched.shared.data.prefs.DataStorePreferenceStorage import com.google.samples.apps.iosched.shared.data.prefs.PreferenceStorage import dagger.Module import dagger.Provides import dagger.hilt.InstallIn import dagger.hilt.android.qualifiers.ApplicationContext import dagger.hilt.components.SingletonComponent import javax.inject.Singleton @InstallIn(SingletonComponent::class) @Module object PreferencesStorageModule { val Context.dataStore by preferencesDataStore( name = DataStorePreferenceStorage.PREFS_NAME, produceMigrations = { context -> listOf( SharedPreferencesMigration( context, DataStorePreferenceStorage.PREFS_NAME ) ) } ) @Singleton @Provides fun providePreferenceStorage(@ApplicationContext context: Context): PreferenceStorage = DataStorePreferenceStorage(context.dataStore) } ================================================ FILE: mobile/src/main/java/com/google/samples/apps/iosched/ui/DispatchInsetsNavHostFragment.kt ================================================ /* * Copyright 2019 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.ui import android.os.Bundle import android.view.View import android.view.ViewGroup import androidx.core.view.forEach import androidx.navigation.fragment.NavHostFragment class DispatchInsetsNavHostFragment : NavHostFragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) view.setOnApplyWindowInsetsListener { v, insets -> // During fragment transitions, multiple fragment's view hierarchies can be added at the // same time. If one consumes window insets, the other might not be layed out properly. // To workaround that, make sure we dispatch the insets to all children, regardless of // how they are consumed. (v as? ViewGroup)?.forEach { child -> child.dispatchApplyWindowInsets(insets) } insets } } } ================================================ FILE: mobile/src/main/java/com/google/samples/apps/iosched/ui/LaunchViewModel.kt ================================================ /* * Copyright 2018 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.ui import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.google.samples.apps.iosched.shared.domain.prefs.OnboardingCompletedUseCase import com.google.samples.apps.iosched.shared.result.Result.Loading import com.google.samples.apps.iosched.shared.result.data import com.google.samples.apps.iosched.ui.LaunchNavigatonAction.NavigateToMainActivityAction import com.google.samples.apps.iosched.ui.LaunchNavigatonAction.NavigateToOnboardingAction import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.flow.SharingStarted.Companion.Eagerly import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.stateIn import javax.inject.Inject /** * Logic for determining which screen to send users to on app launch. */ @HiltViewModel class LaunchViewModel @Inject constructor( onboardingCompletedUseCase: OnboardingCompletedUseCase ) : ViewModel() { val launchDestination = onboardingCompletedUseCase(Unit).map { result -> if (result.data == false) { NavigateToOnboardingAction } else { NavigateToMainActivityAction } }.stateIn(viewModelScope, Eagerly, Loading) } sealed class LaunchNavigatonAction { object NavigateToOnboardingAction : LaunchNavigatonAction() object NavigateToMainActivityAction : LaunchNavigatonAction() } ================================================ FILE: mobile/src/main/java/com/google/samples/apps/iosched/ui/LauncherActivity.kt ================================================ /* * Copyright 2018 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.ui import android.content.Intent import android.os.Bundle import androidx.activity.viewModels import androidx.appcompat.app.AppCompatActivity import androidx.lifecycle.Lifecycle import androidx.lifecycle.lifecycleScope import androidx.lifecycle.repeatOnLifecycle import com.google.samples.apps.iosched.ui.LaunchNavigatonAction.NavigateToMainActivityAction import com.google.samples.apps.iosched.ui.LaunchNavigatonAction.NavigateToOnboardingAction import com.google.samples.apps.iosched.ui.onboarding.OnboardingActivity import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.flow.collect import kotlinx.coroutines.launch /** * A 'Trampoline' activity for sending users to an appropriate screen on launch. */ @AndroidEntryPoint class LauncherActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) val viewModel: LaunchViewModel by viewModels() lifecycleScope.launch { lifecycle.repeatOnLifecycle(Lifecycle.State.STARTED) { viewModel.launchDestination.collect { action -> when (action) { is NavigateToMainActivityAction -> startActivity( Intent(this@LauncherActivity, MainActivity::class.java) ) is NavigateToOnboardingAction -> startActivity( Intent(this@LauncherActivity, OnboardingActivity::class.java) ) } finish() } } } } } ================================================ FILE: mobile/src/main/java/com/google/samples/apps/iosched/ui/MainActivity.kt ================================================ /* * Copyright 2018 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.ui import android.app.Activity import android.content.Intent import android.net.ConnectivityManager import android.os.Bundle import android.view.Menu import androidx.activity.viewModels import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.widget.Toolbar import androidx.core.graphics.Insets import androidx.core.view.ViewCompat import androidx.core.view.WindowCompat import androidx.core.view.WindowInsetsCompat import androidx.core.view.isVisible import androidx.core.view.updatePadding import androidx.lifecycle.Lifecycle import androidx.lifecycle.lifecycleScope import androidx.lifecycle.repeatOnLifecycle import androidx.navigation.NavController import androidx.navigation.fragment.NavHostFragment import androidx.navigation.ui.AppBarConfiguration import androidx.navigation.ui.setupWithNavController import com.firebase.ui.auth.IdpResponse import com.google.samples.apps.iosched.R import com.google.samples.apps.iosched.ar.ArActivity import com.google.samples.apps.iosched.databinding.ActivityMainBinding import com.google.samples.apps.iosched.shared.analytics.AnalyticsActions import com.google.samples.apps.iosched.shared.analytics.AnalyticsHelper import com.google.samples.apps.iosched.shared.di.CodelabsEnabledFlag import com.google.samples.apps.iosched.shared.di.ExploreArEnabledFlag import com.google.samples.apps.iosched.shared.di.MapFeatureEnabledFlag import com.google.samples.apps.iosched.shared.domain.ar.ArConstants import com.google.samples.apps.iosched.ui.messages.SnackbarMessage import com.google.samples.apps.iosched.ui.messages.SnackbarMessageManager import com.google.samples.apps.iosched.ui.signin.SignInDialogFragment import com.google.samples.apps.iosched.ui.signin.SignOutDialogFragment import com.google.samples.apps.iosched.util.HeightTopWindowInsetsListener import com.google.samples.apps.iosched.util.signin.FirebaseAuthErrorCodeConverter import com.google.samples.apps.iosched.util.updateForTheme import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.flow.collect import kotlinx.coroutines.launch import timber.log.Timber import java.util.UUID import javax.inject.Inject @AndroidEntryPoint class MainActivity : AppCompatActivity(), NavigationHost { companion object { /** Key for an int extra defining the initial navigation target. */ const val EXTRA_NAVIGATION_ID = "extra.NAVIGATION_ID" private const val NAV_ID_NONE = -1 private const val DIALOG_SIGN_IN = "dialog_sign_in" private const val DIALOG_SIGN_OUT = "dialog_sign_out" private val TOP_LEVEL_DESTINATIONS = setOf( R.id.navigation_feed, R.id.navigation_schedule, R.id.navigation_map, R.id.navigation_info, R.id.navigation_agenda, R.id.navigation_codelabs, R.id.navigation_settings ) } @Inject lateinit var snackbarMessageManager: SnackbarMessageManager @Inject lateinit var connectivityManager: ConnectivityManager @Inject lateinit var analyticsHelper: AnalyticsHelper @Inject @JvmField @MapFeatureEnabledFlag var mapFeatureEnabled: Boolean = false @Inject @JvmField @CodelabsEnabledFlag var codelabsFeatureEnabled: Boolean = false @Inject @JvmField @ExploreArEnabledFlag var exploreArFeatureEnabled: Boolean = false private val viewModel: MainActivityViewModel by viewModels() private lateinit var binding: ActivityMainBinding private lateinit var navController: NavController private lateinit var navHostFragment: NavHostFragment private var currentNavId = NAV_ID_NONE override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) // Update for Dark Mode straight away updateForTheme(viewModel.currentTheme) WindowCompat.setDecorFitsSystemWindows(window, false) binding = ActivityMainBinding.inflate(layoutInflater) setContentView(binding.root) binding.statusBarScrim.setOnApplyWindowInsetsListener(HeightTopWindowInsetsListener) navHostFragment = supportFragmentManager .findFragmentById(R.id.nav_host_fragment) as NavHostFragment navController = navHostFragment.navController navController.addOnDestinationChangedListener { _, destination, _ -> currentNavId = destination.id // TODO: hide nav if not a top-level destination? } // Either of two different navigation views might exist depending on the configuration. binding.bottomNavigation?.apply { configureNavMenu(menu) setupWithNavController(navController) setOnItemReselectedListener { } // prevent navigating to the same item } binding.navigationRail?.apply { configureNavMenu(menu) setupWithNavController(navController) setOnItemReselectedListener { } // prevent navigating to the same item } if (savedInstanceState == null) { currentNavId = navController.graph.startDestinationId val requestedNavId = intent.getIntExtra(EXTRA_NAVIGATION_ID, currentNavId) navigateTo(requestedNavId) } lifecycleScope.launch { lifecycle.repeatOnLifecycle(Lifecycle.State.STARTED) { launch { viewModel.navigationActions.collect { action -> when (action) { MainNavigationAction.OpenSignIn -> openSignInDialog() MainNavigationAction.OpenSignOut -> openSignOutDialog() } } } launch { viewModel.theme.collect { theme -> updateForTheme(theme) } } // AR-related Flows launch { viewModel.arCoreAvailability.collect { result -> // Do nothing - activate flow Timber.d("ArCoreAvailability = $result") } } launch { viewModel.pinnedSessionsJson.collect { /* Do nothing - activate flow */ } } launch { viewModel.canSignedInUserDemoAr.collect { /* Do nothing - activate flow */ } } } } binding.navigationRail?.let { ViewCompat.setOnApplyWindowInsetsListener(it) { view, insets -> // Pad the Navigation Rail so its content is not behind system bars. val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars()) view.updatePadding(top = systemBars.top, bottom = systemBars.bottom) insets } } ViewCompat.setOnApplyWindowInsetsListener(binding.rootContainer) { view, insets -> // Hide the bottom navigation view whenever the keyboard is visible. val imeVisible = insets.isVisible(WindowInsetsCompat.Type.ime()) binding.bottomNavigation?.isVisible = !imeVisible // If we're showing the bottom navigation, add bottom padding. Also, add left and right // padding since there's no better we can do with horizontal insets. val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars()) val bottomPadding = if (binding.bottomNavigation?.isVisible == true) { systemBars.bottom } else 0 view.updatePadding( left = systemBars.left, right = systemBars.right, bottom = bottomPadding ) // Consume the insets we've used. WindowInsetsCompat.Builder(insets).setInsets( WindowInsetsCompat.Type.systemBars(), Insets.of(0, systemBars.top, 0, systemBars.bottom - bottomPadding) ).build() } } private fun configureNavMenu(menu: Menu) { menu.findItem(R.id.navigation_map)?.isVisible = mapFeatureEnabled menu.findItem(R.id.navigation_codelabs)?.isVisible = codelabsFeatureEnabled menu.findItem(R.id.navigation_explore_ar)?.apply { // Handle launching new activities, otherwise assume the destination is handled // by the nav graph. We want to launch a new Activity for only the AR menu item. isVisible = exploreArFeatureEnabled setOnMenuItemClickListener { if (connectivityManager.activeNetworkInfo?.isConnected == true) { if (viewModel.arCoreAvailability.value?.isSupported == true) { analyticsHelper.logUiEvent( "Navigate to Explore I/O ARCore supported", AnalyticsActions.CLICK ) openExploreAr() } else { analyticsHelper.logUiEvent( "Navigate to Explore I/O ARCore NOT supported", AnalyticsActions.CLICK ) openArCoreNotSupported() } } else { openNoConnection() } true } } } override fun registerToolbarWithNavigation(toolbar: Toolbar) { val appBarConfiguration = AppBarConfiguration(TOP_LEVEL_DESTINATIONS) toolbar.setupWithNavController(navController, appBarConfiguration) } override fun onRestoreInstanceState(savedInstanceState: Bundle) { super.onRestoreInstanceState(savedInstanceState) currentNavId = navController.currentDestination?.id ?: NAV_ID_NONE } override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { super.onActivityResult(requestCode, resultCode, data) if (resultCode == Activity.RESULT_CANCELED) { Timber.d("An activity returned RESULT_CANCELED") val response = IdpResponse.fromResultIntent(data) response?.error?.let { snackbarMessageManager.addMessage( SnackbarMessage( messageId = FirebaseAuthErrorCodeConverter.convert(it.errorCode), requestChangeId = UUID.randomUUID().toString() ) ) } } } override fun onUserInteraction() { super.onUserInteraction() getCurrentFragment()?.onUserInteraction() } private fun getCurrentFragment(): MainNavigationFragment? { return navHostFragment .childFragmentManager .primaryNavigationFragment as? MainNavigationFragment } private fun navigateTo(navId: Int) { if (navId == currentNavId) { return // user tapped the current item } navController.navigate(navId) } private fun openSignInDialog() { SignInDialogFragment().show(supportFragmentManager, DIALOG_SIGN_IN) } private fun openSignOutDialog() { SignOutDialogFragment().show(supportFragmentManager, DIALOG_SIGN_OUT) } private fun openExploreAr() { val intent = Intent( this, ArActivity::class.java ).apply { addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP) putExtra(ArConstants.CAN_SIGNED_IN_USER_DEMO_AR, viewModel.canSignedInUserDemoAr.value) putExtra(ArConstants.PINNED_SESSIONS_JSON_KEY, viewModel.pinnedSessionsJson.value) } startActivity(intent) } private fun openNoConnection() { navigateTo(R.id.navigation_no_network_ar) } private fun openArCoreNotSupported() { navigateTo(R.id.navigation_phone_does_not_support_arcore) } } ================================================ FILE: mobile/src/main/java/com/google/samples/apps/iosched/ui/MainActivityViewModel.kt ================================================ /* * Copyright 2019 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.ui import android.content.Context import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.google.ar.core.ArCoreApk import com.google.samples.apps.iosched.shared.domain.ar.LoadArDebugFlagUseCase import com.google.samples.apps.iosched.shared.domain.sessions.LoadPinnedSessionsJsonUseCase import com.google.samples.apps.iosched.shared.result.Result import com.google.samples.apps.iosched.shared.util.tryOffer import com.google.samples.apps.iosched.ui.signin.SignInViewModelDelegate import com.google.samples.apps.iosched.ui.theme.ThemedActivityDelegate import com.google.samples.apps.iosched.util.WhileViewSubscribed import dagger.hilt.android.lifecycle.HiltViewModel import dagger.hilt.android.qualifiers.ApplicationContext import kotlinx.coroutines.channels.Channel import kotlinx.coroutines.delay import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.collect import kotlinx.coroutines.flow.flow import kotlinx.coroutines.flow.receiveAsFlow import kotlinx.coroutines.flow.stateIn import kotlinx.coroutines.flow.transformLatest import javax.inject.Inject @HiltViewModel class MainActivityViewModel @Inject constructor( signInViewModelDelegate: SignInViewModelDelegate, themedActivityDelegate: ThemedActivityDelegate, loadPinnedSessionsUseCase: LoadPinnedSessionsJsonUseCase, loadArDebugFlagUseCase: LoadArDebugFlagUseCase, @ApplicationContext context: Context ) : ViewModel(), SignInViewModelDelegate by signInViewModelDelegate, ThemedActivityDelegate by themedActivityDelegate { private val _navigationActions = Channel(Channel.CONFLATED) val navigationActions = _navigationActions.receiveAsFlow() val pinnedSessionsJson: StateFlow = userInfo.transformLatest { user -> val uid = user?.getUid() if (uid != null) { loadPinnedSessionsUseCase(uid).collect { result -> if (result is Result.Success) { emit(result.data) } } } else { emit("") } }.stateIn(viewModelScope, WhileViewSubscribed, "") val canSignedInUserDemoAr: StateFlow = userInfo.transformLatest { val result = loadArDebugFlagUseCase(Unit) if (result is Result.Success) { emit(result.data) } }.stateIn(viewModelScope, WhileViewSubscribed, false) val arCoreAvailability: StateFlow = flow { var result: ArCoreApk.Availability? = null while (result == null) { val availability = ArCoreApk.getInstance().checkAvailability(context) // If the availability is transient, we need to call availability check again // as in https://developers.google.com/ar/develop/java/enable-arcore#check_supported if (availability.isTransient) { delay(1000) } else { result = availability emit(result) } } }.stateIn(viewModelScope, WhileViewSubscribed, null) fun onProfileClicked() { if (isUserSignedInValue) { _navigationActions.tryOffer(MainNavigationAction.OpenSignOut) } else { _navigationActions.tryOffer(MainNavigationAction.OpenSignIn) } } } sealed class MainNavigationAction { object OpenSignIn : MainNavigationAction() object OpenSignOut : MainNavigationAction() } ================================================ FILE: mobile/src/main/java/com/google/samples/apps/iosched/ui/MainNavigation.kt ================================================ /* * Copyright 2018 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.ui import android.content.Context import android.os.Bundle import android.view.View import androidx.appcompat.widget.Toolbar import androidx.fragment.app.Fragment import com.google.samples.apps.iosched.R /** * To be implemented by components that host top-level navigation destinations. */ interface NavigationHost { /** Called by MainNavigationFragment to setup it's toolbar with the navigation controller. */ fun registerToolbarWithNavigation(toolbar: Toolbar) } /** * To be implemented by main navigation destinations shown by a [NavigationHost]. */ interface NavigationDestination { /** Called by the host when the user interacts with it. */ fun onUserInteraction() {} } /** * Fragment representing a main navigation destination. This class handles wiring up the [Toolbar] * navigation icon if the fragment is attached to a [NavigationHost]. */ open class MainNavigationFragment : Fragment(), NavigationDestination { protected var navigationHost: NavigationHost? = null override fun onAttach(context: Context) { super.onAttach(context) if (context is NavigationHost) { navigationHost = context } } override fun onDetach() { super.onDetach() navigationHost = null } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { // If we have a toolbar and we are attached to a proper navigation host, set up the toolbar // navigation icon. val host = navigationHost ?: return val mainToolbar: Toolbar = view.findViewById(R.id.toolbar) ?: return mainToolbar.apply { host.registerToolbarWithNavigation(this) } } } ================================================ FILE: mobile/src/main/java/com/google/samples/apps/iosched/ui/NavigationExtensions.kt ================================================ /* * Copyright 2021 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.ui import android.os.Bundle import androidx.core.view.forEach import androidx.navigation.NavController import androidx.navigation.NavDestination import androidx.navigation.ui.NavigationUI.onNavDestinationSelected import com.google.android.material.navigationrail.NavigationRailView import java.lang.ref.WeakReference /** * Like BottomNavigationView.setupWithnavController, but for NavigationRailView. * TODO(jdkoren): A future release of material will combine the listeners (since both views have a * common superclass), which will make this unnecessary. */ fun NavigationRailView.setupWithNavController(navController: NavController) { setOnItemSelectedListener { item -> onNavDestinationSelected(item, navController) } val weakRef = WeakReference(this) val listener = object : NavController.OnDestinationChangedListener { override fun onDestinationChanged( controller: NavController, destination: NavDestination, arguments: Bundle? ) { val view = weakRef.get() if (view == null) { navController.removeOnDestinationChangedListener(this) } else { view.menu.forEach { item -> if (matchNavDestination(destination, item.itemId)) { item.isChecked = true } } } } } navController.addOnDestinationChangedListener(listener) } /** * Copy of package-private method in NavigationUI. TODO(jdkoren): remove when the above is removed. */ private fun matchNavDestination(destination: NavDestination, id: Int): Boolean { var currentDestination = destination while (currentDestination.id != id && currentDestination.parent != null) { currentDestination = currentDestination.parent as NavDestination } return currentDestination.id == id } ================================================ FILE: mobile/src/main/java/com/google/samples/apps/iosched/ui/SectionHeader.kt ================================================ /* * Copyright 2019 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.ui import androidx.annotation.StringRes data class SectionHeader( @StringRes val titleId: Int, val useHorizontalPadding: Boolean = true ) ================================================ FILE: mobile/src/main/java/com/google/samples/apps/iosched/ui/agenda/AgendaAdapter.kt ================================================ /* * Copyright 2018 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.ui.agenda import android.view.LayoutInflater import android.view.ViewGroup import androidx.databinding.DataBindingUtil import androidx.databinding.ViewDataBinding import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.ListAdapter import androidx.recyclerview.widget.RecyclerView import com.google.samples.apps.iosched.BR import com.google.samples.apps.iosched.R import com.google.samples.apps.iosched.model.Block import org.threeten.bp.ZoneId class AgendaAdapter(var timeZoneId: ZoneId = ZoneId.systemDefault()) : ListAdapter(BlockDiff) { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): AgendaViewHolder { return AgendaViewHolder( DataBindingUtil.inflate(LayoutInflater.from(parent.context), viewType, parent, false) ) } override fun onBindViewHolder(holder: AgendaViewHolder, position: Int) { holder.bind(getItem(position), timeZoneId) } override fun getItemViewType(position: Int): Int { return if (getItem(position).isDark) { R.layout.item_agenda_dark } else { R.layout.item_agenda_light } } } class AgendaViewHolder( private val binding: ViewDataBinding ) : RecyclerView.ViewHolder(binding.root) { fun bind(block: Block, timeZoneId: ZoneId) { binding.setVariable(BR.agenda, block) binding.setVariable(BR.timeZoneId, timeZoneId) binding.executePendingBindings() } } object BlockDiff : DiffUtil.ItemCallback() { override fun areItemsTheSame(oldItem: Block, newItem: Block): Boolean { return oldItem.title == newItem.title && oldItem.startTime == newItem.startTime && oldItem.endTime == newItem.endTime } override fun areContentsTheSame(oldItem: Block, newItem: Block) = oldItem == newItem } ================================================ FILE: mobile/src/main/java/com/google/samples/apps/iosched/ui/agenda/AgendaFragment.kt ================================================ /* * Copyright 2018 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.ui.agenda import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.core.view.WindowInsetsCompat import androidx.core.view.updatePadding import androidx.databinding.BindingAdapter import androidx.fragment.app.activityViewModels import androidx.fragment.app.viewModels import androidx.recyclerview.widget.RecyclerView import com.google.samples.apps.iosched.databinding.FragmentAgendaBinding import com.google.samples.apps.iosched.model.Block import com.google.samples.apps.iosched.shared.util.TimeUtils import com.google.samples.apps.iosched.ui.MainActivityViewModel import com.google.samples.apps.iosched.ui.MainNavigationFragment import com.google.samples.apps.iosched.ui.signin.setupProfileMenuItem import com.google.samples.apps.iosched.util.clearDecorations import com.google.samples.apps.iosched.util.doOnApplyWindowInsets import dagger.hilt.android.AndroidEntryPoint import org.threeten.bp.ZoneId @AndroidEntryPoint class AgendaFragment : MainNavigationFragment() { private val viewModel: AgendaViewModel by viewModels() private val mainActivityViewModel: MainActivityViewModel by activityViewModels() private lateinit var binding: FragmentAgendaBinding override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View { binding = FragmentAgendaBinding.inflate(inflater, container, false).apply { lifecycleOwner = viewLifecycleOwner } // Pad the bottom of the RecyclerView so that the content scrolls up above the nav bar binding.recyclerView.doOnApplyWindowInsets { v, insets, padding -> val systemInsets = insets.getInsets( WindowInsetsCompat.Type.systemBars() or WindowInsetsCompat.Type.ime() ) v.updatePadding(bottom = padding.bottom + systemInsets.bottom) } return binding.root } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) binding.viewModel = viewModel binding.toolbar.setupProfileMenuItem(mainActivityViewModel, viewLifecycleOwner) } } @BindingAdapter(value = ["agendaItems", "timeZoneId"]) fun agendaItems(recyclerView: RecyclerView, list: List?, zoneId: ZoneId?) { list ?: return zoneId ?: return val isInConferenceTimeZone = TimeUtils.isConferenceTimeZone(zoneId) if (recyclerView.adapter == null) { recyclerView.adapter = AgendaAdapter() } (recyclerView.adapter as AgendaAdapter).apply { submitList(list) timeZoneId = zoneId } // Recreate the decoration used for the sticky date headers recyclerView.clearDecorations() if (list.isNotEmpty()) { recyclerView.addItemDecoration( AgendaHeadersDecoration(recyclerView.context, list, isInConferenceTimeZone) ) } } ================================================ FILE: mobile/src/main/java/com/google/samples/apps/iosched/ui/agenda/AgendaHeaderIndexer.kt ================================================ /* * Copyright 2018 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.ui.agenda import com.google.samples.apps.iosched.model.Block import org.threeten.bp.ZonedDateTime /** * Find the first block of each day (rounded down to nearest day) and return pairs of * index to start time. Assumes that [agendaItems] are sorted by ascending start time. */ fun indexAgendaHeaders(agendaItems: List): List> { return agendaItems .mapIndexed { index, block -> index to block.startTime } .distinctBy { it.second.dayOfMonth } } ================================================ FILE: mobile/src/main/java/com/google/samples/apps/iosched/ui/agenda/AgendaHeadersDecoration.kt ================================================ /* * Copyright 2018 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.ui.agenda import android.content.Context import android.graphics.Canvas import android.graphics.Paint import android.graphics.Rect import android.text.Layout.Alignment.ALIGN_CENTER import android.text.StaticLayout import android.text.TextPaint import android.view.View import androidx.core.content.res.ResourcesCompat import androidx.core.content.res.getColorOrThrow import androidx.core.content.res.getDimensionOrThrow import androidx.core.content.res.getDimensionPixelSizeOrThrow import androidx.core.content.res.getResourceIdOrThrow import androidx.core.graphics.withTranslation import androidx.core.view.forEach import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView.ItemDecoration import androidx.recyclerview.widget.RecyclerView.State import com.google.samples.apps.iosched.R import com.google.samples.apps.iosched.model.Block import com.google.samples.apps.iosched.shared.util.TimeUtils import com.google.samples.apps.iosched.util.newStaticLayout import kotlin.math.ceil import org.threeten.bp.ZonedDateTime /** * A [RecyclerView.ItemDecoration] which draws sticky headers marking the days in a given list of * [Block]s. It also inserts gaps between days. */ class AgendaHeadersDecoration( context: Context, blocks: List, inConferenceTimeZone: Boolean ) : ItemDecoration() { private val paint: TextPaint private val textWidth: Int private val decorHeight: Int private val verticalBias: Float init { val attrs = context.obtainStyledAttributes( R.style.Widget_IOSched_DateHeaders, R.styleable.DateHeader ) paint = TextPaint(Paint.ANTI_ALIAS_FLAG or Paint.SUBPIXEL_TEXT_FLAG).apply { color = attrs.getColorOrThrow(R.styleable.DateHeader_android_textColor) textSize = attrs.getDimensionOrThrow(R.styleable.DateHeader_android_textSize) try { typeface = ResourcesCompat.getFont( context, attrs.getResourceIdOrThrow(R.styleable.DateHeader_android_fontFamily) ) } catch (_: Exception) { // ignore } } textWidth = attrs.getDimensionPixelSizeOrThrow(R.styleable.DateHeader_android_width) val height = attrs.getDimensionPixelSizeOrThrow(R.styleable.DateHeader_android_height) val minHeight = ceil(paint.textSize).toInt() decorHeight = Math.max(height, minHeight) verticalBias = attrs.getFloat(R.styleable.DateHeader_verticalBias, 0.5f).coerceIn(0f, 1f) attrs.recycle() } // Get the block index:day and create header layouts for each private val daySlots: Map = indexAgendaHeaders(blocks).map { it.first to createHeader(context, it.second, inConferenceTimeZone) }.toMap() override fun getItemOffsets(outRect: Rect, view: View, parent: RecyclerView, state: State) { val position = parent.getChildAdapterPosition(view) outRect.top = if (daySlots.containsKey(position)) decorHeight else 0 } override fun onDraw(canvas: Canvas, parent: RecyclerView, state: State) { val layoutManager = parent.layoutManager ?: return val centerX = parent.width / 2f parent.forEach { child -> if (child.top < parent.height && child.bottom > 0) { // Child is visible val layout = daySlots[parent.getChildAdapterPosition(child)] if (layout != null) { val dx = centerX - (layout.width / 2) val dy = layoutManager.getDecoratedTop(child) + child.translationY + // offset vertically within the space according to the bias (decorHeight - layout.height) * verticalBias canvas.withTranslation(x = dx, y = dy) { layout.draw(this) } } } } } /** * Create a header layout for the given [time] */ private fun createHeader( context: Context, time: ZonedDateTime, inConferenceTimeZone: Boolean ): StaticLayout { val labelRes = TimeUtils.getLabelResForTime(time, inConferenceTimeZone) val text = context.getText(labelRes) return newStaticLayout(text, paint, textWidth, ALIGN_CENTER, 1f, 0f, false) } } ================================================ FILE: mobile/src/main/java/com/google/samples/apps/iosched/ui/agenda/AgendaItemBindingAdapter.kt ================================================ /* * Copyright 2018 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.ui.agenda import android.graphics.drawable.GradientDrawable import android.view.View import android.widget.ImageView import android.widget.TextView import androidx.appcompat.content.res.AppCompatResources import androidx.databinding.BindingAdapter import com.google.samples.apps.iosched.R import com.google.samples.apps.iosched.shared.util.TimeUtils import org.threeten.bp.ZoneId import org.threeten.bp.ZonedDateTime import org.threeten.bp.format.DateTimeFormatter private val agendaTimePattern = DateTimeFormatter.ofPattern("h:mm a") @BindingAdapter( value = ["agendaColor", "agendaStrokeColor", "agendaStrokeWidth"], requireAll = true ) fun agendaColor(view: View, fillColor: Int, strokeColor: Int, strokeWidth: Float) { view.background = (view.background as? GradientDrawable ?: GradientDrawable()).apply { setColor(fillColor) setStroke(strokeWidth.toInt(), strokeColor) } } @BindingAdapter("agendaIcon") fun agendaIcon(imageView: ImageView, type: String) { val iconId = when (type) { "after_hours" -> R.drawable.ic_agenda_after_hours "badge" -> R.drawable.ic_agenda_badge "codelab" -> R.drawable.ic_agenda_codelab "concert" -> R.drawable.ic_agenda_concert "keynote" -> R.drawable.ic_agenda_keynote "meal" -> R.drawable.ic_agenda_meal "office_hours" -> R.drawable.ic_agenda_office_hours "sandbox" -> R.drawable.ic_agenda_sandbox "store" -> R.drawable.ic_agenda_store else -> R.drawable.ic_agenda_session } imageView.setImageDrawable(AppCompatResources.getDrawable(imageView.context, iconId)) } @BindingAdapter(value = ["startTime", "endTime", "timeZoneId"], requireAll = true) fun agendaDuration( textView: TextView, startTime: ZonedDateTime, endTime: ZonedDateTime, timeZoneId: ZoneId ) { textView.text = textView.context.getString( R.string.agenda_duration, agendaTimePattern.format(TimeUtils.zonedTime(startTime, timeZoneId)), agendaTimePattern.format(TimeUtils.zonedTime(endTime, timeZoneId)) ) } ================================================ FILE: mobile/src/main/java/com/google/samples/apps/iosched/ui/agenda/AgendaViewModel.kt ================================================ /* * Copyright 2019 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.ui.agenda import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.google.samples.apps.iosched.model.Block import com.google.samples.apps.iosched.shared.domain.agenda.LoadAgendaUseCase import com.google.samples.apps.iosched.shared.domain.settings.GetTimeZoneUseCase import com.google.samples.apps.iosched.shared.result.data import com.google.samples.apps.iosched.shared.util.TimeUtils import com.google.samples.apps.iosched.util.WhileViewSubscribed import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.flow import kotlinx.coroutines.flow.stateIn import org.threeten.bp.ZoneId import javax.inject.Inject @HiltViewModel class AgendaViewModel @Inject constructor( private val loadAgendaUseCase: LoadAgendaUseCase, private val getTimeZoneUseCase: GetTimeZoneUseCase ) : ViewModel() { // Expose agenda data val agenda: StateFlow> = flow { val agendaData = loadAgendaUseCase(false).data ?: emptyList() emit(agendaData) }.stateIn(viewModelScope, WhileViewSubscribed, initialValue = emptyList()) // Expose whether we're on conference timezone or local val timeZoneId = flow { if (getTimeZoneUseCase(Unit).data == true) { emit(TimeUtils.CONFERENCE_TIMEZONE) } else { emit(ZoneId.systemDefault()) } }.stateIn(viewModelScope, WhileViewSubscribed, initialValue = ZoneId.systemDefault()) } ================================================ FILE: mobile/src/main/java/com/google/samples/apps/iosched/ui/ar/ArCoreNotSupportedFragment.kt ================================================ /* * Copyright 2019 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.ui.ar import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.fragment.app.Fragment import com.google.samples.apps.iosched.R class ArCoreNotSupportedFragment : Fragment() { override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? { return inflater.inflate(R.layout.fragment_arcore_not_supported, container, false) } } ================================================ FILE: mobile/src/main/java/com/google/samples/apps/iosched/ui/ar/NoNetworkConnectionFragment.kt ================================================ /* * Copyright 2019 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.ui.ar import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.fragment.app.Fragment import com.google.samples.apps.iosched.R class NoNetworkConnectionFragment : Fragment() { override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? { return inflater.inflate(R.layout.fragment_no_network, container, false) } } ================================================ FILE: mobile/src/main/java/com/google/samples/apps/iosched/ui/codelabs/CodelabsActionsHandler.kt ================================================ /* * Copyright 2019 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.ui.codelabs import com.google.samples.apps.iosched.model.Codelab interface CodelabsActionsHandler { fun dismissCodelabsInfoCard() fun openCodelabsOnMap() fun launchCodelabsWebsite() fun startCodelab(codelab: Codelab) } ================================================ FILE: mobile/src/main/java/com/google/samples/apps/iosched/ui/codelabs/CodelabsAdapter.kt ================================================ /* * Copyright 2019 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.ui.codelabs import android.annotation.SuppressLint import android.os.Bundle import android.transition.TransitionInflater import android.transition.TransitionManager import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.TextView import androidx.databinding.BindingAdapter import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.ListAdapter import androidx.recyclerview.widget.RecyclerView.RecycledViewPool import androidx.recyclerview.widget.RecyclerView.ViewHolder import com.google.android.flexbox.FlexboxLayoutManager import com.google.samples.apps.iosched.R import com.google.samples.apps.iosched.databinding.ItemCodelabBinding import com.google.samples.apps.iosched.databinding.ItemCodelabsInformationCardBinding import com.google.samples.apps.iosched.model.Codelab import com.google.samples.apps.iosched.ui.codelabs.CodelabsViewHolder.CodelabItemHolder import com.google.samples.apps.iosched.ui.codelabs.CodelabsViewHolder.CodelabsInformationCardHolder import com.google.samples.apps.iosched.util.compatRemoveIf import com.google.samples.apps.iosched.util.executeAfter internal class CodelabsAdapter( private val codelabsActionsHandler: CodelabsActionsHandler, private val tagViewPool: RecycledViewPool, savedState: Bundle? ) : ListAdapter(CodelabsDiffCallback) { companion object { private const val STATE_KEY_EXPANDED_IDS = "CodelabsAdapter:expandedIds" } private var expandedIds = mutableSetOf() init { savedState?.getStringArray(STATE_KEY_EXPANDED_IDS)?.let { expandedIds.addAll(it) } } fun onSaveInstanceState(state: Bundle) { state.putStringArray(STATE_KEY_EXPANDED_IDS, expandedIds.toTypedArray()) } override fun submitList(list: List?) { // Clear out any invalid IDs if (list == null) { expandedIds.clear() } else { val ids = list.filterIsInstance().map { it.id } expandedIds.compatRemoveIf { it !in ids } } super.submitList(list) } override fun getItemViewType(position: Int): Int { return when (val item = getItem(position)) { is Codelab -> R.layout.item_codelab is CodelabsInformationCard -> R.layout.item_codelabs_information_card else -> throw IllegalStateException("Unknown type: ${item::class.java.simpleName}") } } override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): CodelabsViewHolder { val inflater = LayoutInflater.from(parent.context) return when (viewType) { R.layout.item_codelab -> CodelabItemHolder( ItemCodelabBinding.inflate(inflater, parent, false).apply { actionHandler = codelabsActionsHandler codelabTags.apply { setRecycledViewPool(tagViewPool) layoutManager = FlexboxLayoutManager(parent.context).apply { recycleChildrenOnDetach = true } } } ) R.layout.item_codelabs_information_card -> CodelabsInformationCardHolder( ItemCodelabsInformationCardBinding.inflate(inflater, parent, false).apply { actionHandler = codelabsActionsHandler } ) else -> throw IllegalArgumentException("Invalid viewType") } } override fun onBindViewHolder(holder: CodelabsViewHolder, position: Int) { if (holder is CodelabItemHolder) { bindCodelabItemHolder(holder, getItem(position) as Codelab) } // Other types don't need additional binding } private fun bindCodelabItemHolder(holder: CodelabItemHolder, item: Codelab) { holder.binding.executeAfter { codelab = item isExpanded = expandedIds.contains(item.id) } // In certain configurations the view already has a click listener to start the codelab. if (!holder.itemView.hasOnClickListeners()) { holder.itemView.setOnClickListener { val parent = holder.itemView.parent as? ViewGroup ?: return@setOnClickListener val expanded = holder.binding.isExpanded ?: false if (expanded) { expandedIds.remove(item.id) } else { expandedIds.add(item.id) } val transition = TransitionInflater.from(holder.itemView.context) .inflateTransition(R.transition.codelab_toggle) TransitionManager.beginDelayedTransition(parent, transition) holder.binding.executeAfter { isExpanded = !expanded } } } } } // Marker objects for singleton items object CodelabsInformationCard internal sealed class CodelabsViewHolder(itemView: View) : ViewHolder(itemView) { class CodelabItemHolder( val binding: ItemCodelabBinding ) : CodelabsViewHolder(binding.root) class CodelabsInformationCardHolder( val binding: ItemCodelabsInformationCardBinding ) : CodelabsViewHolder(binding.root) } internal object CodelabsDiffCallback : DiffUtil.ItemCallback() { override fun areItemsTheSame(oldItem: Any, newItem: Any): Boolean { return when { oldItem === CodelabsInformationCard && newItem === CodelabsInformationCard -> true oldItem is Codelab && newItem is Codelab -> oldItem.id == newItem.id else -> false } } @SuppressLint("DiffUtilEquals") // Workaround of https://issuetracker.google.com/issues/122928037 override fun areContentsTheSame(oldItem: Any, newItem: Any): Boolean { return when { oldItem is Codelab && newItem is Codelab -> oldItem == newItem else -> true } } } @BindingAdapter("codelabDuration") fun codelabDuration(view: TextView, durationMinutes: Int) { view.text = view.resources.getString(R.string.codelab_duration, durationMinutes) } ================================================ FILE: mobile/src/main/java/com/google/samples/apps/iosched/ui/codelabs/CodelabsFragment.kt ================================================ /* * Copyright 2019 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.ui.codelabs import android.net.Uri import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.core.view.WindowInsetsCompat import androidx.core.view.updatePadding import androidx.fragment.app.activityViewModels import androidx.fragment.app.viewModels import androidx.navigation.fragment.findNavController import androidx.recyclerview.widget.RecyclerView.RecycledViewPool import com.google.samples.apps.iosched.R import com.google.samples.apps.iosched.databinding.FragmentCodelabsBinding import com.google.samples.apps.iosched.model.Codelab import com.google.samples.apps.iosched.shared.analytics.AnalyticsActions import com.google.samples.apps.iosched.shared.analytics.AnalyticsHelper import com.google.samples.apps.iosched.shared.di.MapFeatureEnabledFlag import com.google.samples.apps.iosched.shared.util.consume import com.google.samples.apps.iosched.ui.MainActivityViewModel import com.google.samples.apps.iosched.ui.MainNavigationFragment import com.google.samples.apps.iosched.ui.signin.setupProfileMenuItem import com.google.samples.apps.iosched.util.doOnApplyWindowInsets import com.google.samples.apps.iosched.util.launchAndRepeatWithViewLifecycle import com.google.samples.apps.iosched.util.openWebsiteUri import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.flow.collect import javax.inject.Inject import javax.inject.Named @AndroidEntryPoint class CodelabsFragment : MainNavigationFragment(), CodelabsActionsHandler { companion object { private const val CODELABS_WEBSITE = "https://g.co/io/codelabs" private const val PARAM_UTM_SOURCE = "utm_source" private const val PARAM_UTM_MEDIUM = "utm_medium" private const val VALUE_UTM_SOURCE = "ioapp" private const val VALUE_UTM_MEDIUM = "android" } @Inject @Named("tagViewPool") lateinit var tagRecycledViewPool: RecycledViewPool @Inject @JvmField @MapFeatureEnabledFlag var mapFeatureEnabled: Boolean = false @Inject lateinit var analyticsHelper: AnalyticsHelper private lateinit var binding: FragmentCodelabsBinding private val codelabsViewModel: CodelabsViewModel by viewModels() private val mainActivityViewModel: MainActivityViewModel by activityViewModels() private lateinit var codelabsAdapter: CodelabsAdapter override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View { binding = FragmentCodelabsBinding.inflate(inflater, container, false) return binding.root } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) binding.toolbar.apply { setupProfileMenuItem(mainActivityViewModel, viewLifecycleOwner) menu.findItem(R.id.action_see_on_map)?.isVisible = mapFeatureEnabled setOnMenuItemClickListener { when (it.itemId) { R.id.action_see_on_map -> consume { openCodelabsOnMap() } R.id.action_codelabs_website -> consume { launchCodelabsWebsite() } } false } } codelabsAdapter = CodelabsAdapter( this, tagRecycledViewPool, savedInstanceState ) binding.codelabsList.apply { adapter = codelabsAdapter setHasFixedSize(true) } // Pad the bottom of the RecyclerView so that the content scrolls up above the nav bar binding.codelabsList.doOnApplyWindowInsets { v, insets, padding -> val systemInsets = insets.getInsets( WindowInsetsCompat.Type.systemBars() or WindowInsetsCompat.Type.ime() ) v.updatePadding(bottom = padding.bottom + systemInsets.bottom) } launchAndRepeatWithViewLifecycle { codelabsViewModel.screenContent.collect { codelabsAdapter.submitList(it) } } analyticsHelper.sendScreenView("Codelabs", requireActivity()) } override fun onSaveInstanceState(outState: Bundle) { super.onSaveInstanceState(outState) codelabsAdapter.onSaveInstanceState(outState) } override fun dismissCodelabsInfoCard() { // Pass to ViewModel, which will update the list contents codelabsViewModel.dismissCodelabsInfoCard() } override fun openCodelabsOnMap() { findNavController().navigate(CodelabsFragmentDirections.toMap()) // No analytics event, we log map marker selection in MapViewModel already. } override fun launchCodelabsWebsite() { openWebsiteUri(requireContext(), addCodelabsAnalyticsQueryParams(CODELABS_WEBSITE)) analyticsHelper.logUiEvent("Codelabs Website", AnalyticsActions.CLICK) } override fun startCodelab(codelab: Codelab) { if (codelab.hasUrl()) { openWebsiteUri(requireContext(), addCodelabsAnalyticsQueryParams(codelab.codelabUrl)) analyticsHelper.logUiEvent("Start codelab \"${codelab.title}\"", AnalyticsActions.CLICK) } } private fun addCodelabsAnalyticsQueryParams(url: String): Uri { return Uri.parse(url) .buildUpon() .appendQueryParameter(PARAM_UTM_SOURCE, VALUE_UTM_SOURCE) .appendQueryParameter(PARAM_UTM_MEDIUM, VALUE_UTM_MEDIUM) .build() } } ================================================ FILE: mobile/src/main/java/com/google/samples/apps/iosched/ui/codelabs/CodelabsViewModel.kt ================================================ /* * Copyright 2019 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.ui.codelabs import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.google.samples.apps.iosched.model.Codelab import com.google.samples.apps.iosched.shared.domain.codelabs.GetCodelabsInfoCardShownUseCase import com.google.samples.apps.iosched.shared.domain.codelabs.LoadCodelabsUseCase import com.google.samples.apps.iosched.shared.domain.codelabs.SetCodelabsInfoCardShownUseCase import com.google.samples.apps.iosched.shared.result.successOr import com.google.samples.apps.iosched.util.WhileViewSubscribed import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.flow import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.stateIn import kotlinx.coroutines.launch import java.util.Collections.emptyList import javax.inject.Inject @HiltViewModel class CodelabsViewModel @Inject constructor( loadCodelabsUseCase: LoadCodelabsUseCase, getCodelabsInfoCardShownUseCase: GetCodelabsInfoCardShownUseCase, private val setCodelabsInfoCardShownUseCase: SetCodelabsInfoCardShownUseCase ) : ViewModel() { private val infoCardDismissed = getCodelabsInfoCardShownUseCase(Unit).map { it.successOr(false) } private val codelabs = flow { emit(loadCodelabsUseCase(Unit).successOr(emptyList())) } val screenContent = combine(codelabs, infoCardDismissed) { list, cardDismissed -> buildScreenContent(list, cardDismissed) }.stateIn(viewModelScope, WhileViewSubscribed, emptyList()) private fun buildScreenContent(codelabs: List, cardDismissed: Boolean): List { val items = mutableListOf() if (!cardDismissed) { items.add(CodelabsInformationCard) } items.addAll(codelabs) return items } fun dismissCodelabsInfoCard() { viewModelScope.launch { setCodelabsInfoCardShownUseCase(Unit) } } } ================================================ FILE: mobile/src/main/java/com/google/samples/apps/iosched/ui/feed/AnnouncementsFragment.kt ================================================ /* * Copyright 2020 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.ui.feed import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.core.view.WindowInsetsCompat import androidx.core.view.isVisible import androidx.core.view.updatePadding import androidx.fragment.app.activityViewModels import androidx.fragment.app.viewModels import com.google.common.collect.ImmutableMap import com.google.samples.apps.iosched.databinding.FragmentAnnouncementsBinding import com.google.samples.apps.iosched.shared.analytics.AnalyticsHelper import com.google.samples.apps.iosched.ui.MainActivityViewModel import com.google.samples.apps.iosched.ui.MainNavigationFragment import com.google.samples.apps.iosched.ui.signin.setupProfileMenuItem import com.google.samples.apps.iosched.util.doOnApplyWindowInsets import com.google.samples.apps.iosched.util.launchAndRepeatWithViewLifecycle import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.flow.collect import javax.inject.Inject @AndroidEntryPoint class AnnouncementsFragment : MainNavigationFragment() { @Inject lateinit var analyticsHelper: AnalyticsHelper private val model: AnnouncementsViewModel by viewModels() private val mainActivityViewModel: MainActivityViewModel by activityViewModels() private lateinit var binding: FragmentAnnouncementsBinding private lateinit var adapter: FeedAdapter override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? { binding = FragmentAnnouncementsBinding.inflate(inflater, container, false) .apply { lifecycleOwner = viewLifecycleOwner viewModel = model } adapter = createAdapter() binding.recyclerView.adapter = adapter return binding.root } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) analyticsHelper.sendScreenView("Announcements", requireActivity()) binding.toolbar.setupProfileMenuItem(mainActivityViewModel, viewLifecycleOwner) binding.root.doOnApplyWindowInsets { _, insets, _ -> val systemInsets = insets.getInsets(WindowInsetsCompat.Type.systemBars()) binding.statusBar.run { layoutParams.height = systemInsets.top isVisible = layoutParams.height > 0 requestLayout() } } binding.recyclerView.doOnApplyWindowInsets { v, insets, padding -> val systemInsets = insets.getInsets( WindowInsetsCompat.Type.systemBars() or WindowInsetsCompat.Type.ime() ) v.updatePadding(bottom = padding.bottom + systemInsets.bottom) } launchAndRepeatWithViewLifecycle { model.announcements.collect { (binding.recyclerView.adapter as FeedAdapter).submitList(it) } } } private fun createAdapter(): FeedAdapter { val announcementViewBinder = AnnouncementViewBinder(model.timeZoneId, this) val announcementsEmptyViewBinder = AnnouncementsEmptyViewBinder() val announcementsLoadingViewBinder = AnnouncementsLoadingViewBinder() @Suppress("UNCHECKED_CAST") return FeedAdapter( ImmutableMap.builder() .put( announcementViewBinder.modelClass, announcementViewBinder as FeedItemBinder ) .put( announcementsEmptyViewBinder.modelClass, announcementsEmptyViewBinder as FeedItemBinder ) .put( announcementsLoadingViewBinder.modelClass, announcementsLoadingViewBinder as FeedItemBinder ).build() ) } } ================================================ FILE: mobile/src/main/java/com/google/samples/apps/iosched/ui/feed/AnnouncementsViewModel.kt ================================================ /* * Copyright 2020 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.ui.feed import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.google.samples.apps.iosched.shared.domain.feed.LoadAnnouncementsUseCase import com.google.samples.apps.iosched.shared.domain.settings.GetTimeZoneUseCase import com.google.samples.apps.iosched.shared.result.Result.Loading import com.google.samples.apps.iosched.shared.result.successOr import com.google.samples.apps.iosched.shared.time.TimeProvider import com.google.samples.apps.iosched.shared.util.TimeUtils import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.flow.SharingStarted.Companion.Eagerly import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.flow import kotlinx.coroutines.flow.stateIn import org.threeten.bp.ZoneId import javax.inject.Inject @HiltViewModel class AnnouncementsViewModel @Inject constructor( loadAnnouncementsUseCase: LoadAnnouncementsUseCase, getTimeZoneUseCase: GetTimeZoneUseCase, timeProvider: TimeProvider ) : ViewModel() { val announcements: StateFlow> = flow { val loadAnnouncementsResult = loadAnnouncementsUseCase(timeProvider.now()) if (loadAnnouncementsResult is Loading) { emit(listOf(LoadingIndicator)) } else { val items = loadAnnouncementsResult.successOr(emptyList()) if (items.isNotEmpty()) { emit(items) } else { emit(listOf(AnnouncementsEmpty)) } } }.stateIn(viewModelScope, Eagerly, emptyList()) val timeZoneId: StateFlow = flow { val timeZoneResult = getTimeZoneUseCase(Unit) if (timeZoneResult.successOr(true)) { emit(TimeUtils.CONFERENCE_TIMEZONE) } else { emit(ZoneId.systemDefault()) } }.stateIn(viewModelScope, Eagerly, TimeUtils.CONFERENCE_TIMEZONE) } ================================================ FILE: mobile/src/main/java/com/google/samples/apps/iosched/ui/feed/FeedAdapter.kt ================================================ /* * Copyright 2019 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.ui.feed import android.view.ViewGroup import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.ListAdapter import androidx.recyclerview.widget.RecyclerView.ViewHolder typealias FeedItemClass = Class typealias FeedItemBinder = FeedItemViewBinder class FeedAdapter( private val viewBinders: Map ) : ListAdapter(FeedDiffCallback(viewBinders)) { private val viewTypeToBinders = viewBinders.mapKeys { it.value.getFeedItemType() } private fun getViewBinder(viewType: Int): FeedItemBinder = viewTypeToBinders.getValue(viewType) override fun getItemViewType(position: Int): Int = viewBinders.getValue(super.getItem(position).javaClass).getFeedItemType() override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { return getViewBinder(viewType).createViewHolder(parent) } override fun onBindViewHolder(holder: ViewHolder, position: Int) { return getViewBinder(getItemViewType(position)).bindViewHolder(getItem(position), holder) } override fun onViewRecycled(holder: ViewHolder) { getViewBinder(holder.itemViewType).onViewRecycled(holder) super.onViewRecycled(holder) } override fun onViewDetachedFromWindow(holder: ViewHolder) { getViewBinder(holder.itemViewType).onViewDetachedFromWindow(holder) super.onViewDetachedFromWindow(holder) } } /** Encapsulates logic to create and bind a ViewHolder for a type of item in the Feed. */ abstract class FeedItemViewBinder( val modelClass: Class ) : DiffUtil.ItemCallback() { abstract fun createViewHolder(parent: ViewGroup): ViewHolder abstract fun bindViewHolder(model: M, viewHolder: VH) abstract fun getFeedItemType(): Int // Having these as non abstract because not all the viewBinders are required to implement them. open fun onViewRecycled(viewHolder: VH) = Unit open fun onViewDetachedFromWindow(viewHolder: VH) = Unit } internal class FeedDiffCallback( private val viewBinders: Map ) : DiffUtil.ItemCallback() { override fun areItemsTheSame(oldItem: Any, newItem: Any): Boolean { if (oldItem::class != newItem::class) { return false } return viewBinders[oldItem::class.java]?.areItemsTheSame(oldItem, newItem) ?: false } override fun areContentsTheSame(oldItem: Any, newItem: Any): Boolean { // We know the items are the same class because [areItemsTheSame] returned true return viewBinders[oldItem::class.java]?.areContentsTheSame(oldItem, newItem) ?: false } } ================================================ FILE: mobile/src/main/java/com/google/samples/apps/iosched/ui/feed/FeedAnnouncementViewBinders.kt ================================================ /* * Copyright 2019 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.ui.feed import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.TextView import androidx.databinding.BindingAdapter import androidx.lifecycle.LifecycleOwner import androidx.recyclerview.widget.RecyclerView.ViewHolder import com.google.samples.apps.iosched.R import com.google.samples.apps.iosched.databinding.ItemFeedAnnouncementBinding import com.google.samples.apps.iosched.databinding.ItemFeedAnnouncementsHeaderBinding import com.google.samples.apps.iosched.model.Announcement import com.google.samples.apps.iosched.shared.util.TimeUtils import kotlinx.coroutines.flow.StateFlow import org.threeten.bp.ZoneId import org.threeten.bp.ZonedDateTime /** A data class representing the state of the announcements header card on feed */ data class AnnouncementsHeader( val showPastNotificationsButton: Boolean ) class AnnouncementsHeaderViewBinder( private val lifecycleOwner: LifecycleOwner, private val eventListener: FeedEventListener ) : FeedItemViewBinder( AnnouncementsHeader::class.java ) { override fun createViewHolder(parent: ViewGroup) = AnnouncementsPreviewViewHolder( ItemFeedAnnouncementsHeaderBinding.inflate( LayoutInflater.from(parent.context), parent, false ), lifecycleOwner, eventListener ) override fun bindViewHolder( model: AnnouncementsHeader, viewHolder: AnnouncementsPreviewViewHolder ) = viewHolder.bind(model) override fun getFeedItemType() = R.layout.item_feed_announcements_header override fun areItemsTheSame( oldItem: AnnouncementsHeader, newItem: AnnouncementsHeader ) = true override fun areContentsTheSame( oldItem: AnnouncementsHeader, newItem: AnnouncementsHeader ) = oldItem == newItem } class AnnouncementsPreviewViewHolder( private val binding: ItemFeedAnnouncementsHeaderBinding, private val lifecycleOwner: LifecycleOwner, private val eventListener: FeedEventListener ) : ViewHolder(binding.root) { fun bind(model: AnnouncementsHeader) { binding.announcementsHeaderState = model binding.lifecycleOwner = lifecycleOwner binding.eventListener = eventListener } } // For Announcement items class AnnouncementViewBinder( private val timeZoneId: StateFlow, private val lifecycleOwner: LifecycleOwner ) : FeedItemViewBinder( Announcement::class.java ) { override fun createViewHolder(parent: ViewGroup): AnnouncementViewHolder = AnnouncementViewHolder( ItemFeedAnnouncementBinding.inflate(LayoutInflater.from(parent.context), parent, false), lifecycleOwner, timeZoneId ) override fun bindViewHolder(model: Announcement, viewHolder: AnnouncementViewHolder) { viewHolder.bind(model) } override fun getFeedItemType(): Int = R.layout.item_feed_announcement override fun areItemsTheSame(oldItem: Announcement, newItem: Announcement): Boolean = oldItem.id == newItem.id override fun areContentsTheSame(oldItem: Announcement, newItem: Announcement) = oldItem == newItem } class AnnouncementViewHolder( private val binding: ItemFeedAnnouncementBinding, private val lifecycleOwner: LifecycleOwner, private val timeZoneId: StateFlow ) : ViewHolder(binding.root) { fun bind(announcement: Announcement) { binding.announcement = announcement binding.lifecycleOwner = lifecycleOwner binding.timeZoneId = timeZoneId binding.executePendingBindings() } } // Shown while loading Announcements object LoadingIndicator class LoadingViewHolder(itemView: View) : ViewHolder(itemView) class AnnouncementsLoadingViewBinder : FeedItemViewBinder( LoadingIndicator::class.java ) { override fun createViewHolder(parent: ViewGroup): ViewHolder { return LoadingViewHolder( LayoutInflater.from(parent.context).inflate(getFeedItemType(), parent, false) ) } override fun bindViewHolder(model: LoadingIndicator, viewHolder: LoadingViewHolder) {} override fun getFeedItemType() = R.layout.item_feed_announcements_loading override fun areItemsTheSame(oldItem: LoadingIndicator, newItem: LoadingIndicator) = true override fun areContentsTheSame(oldItem: LoadingIndicator, newItem: LoadingIndicator) = true } // Shown if there are no Announcements or fetching Announcments fails object AnnouncementsEmpty class EmptyViewHolder(itemView: View) : ViewHolder(itemView) class AnnouncementsEmptyViewBinder : FeedItemViewBinder( AnnouncementsEmpty::class.java ) { override fun createViewHolder(parent: ViewGroup): ViewHolder { return EmptyViewHolder( LayoutInflater.from(parent.context).inflate(getFeedItemType(), parent, false) ) } override fun bindViewHolder(model: AnnouncementsEmpty, viewHolder: EmptyViewHolder) {} override fun getFeedItemType() = R.layout.item_feed_announcements_empty override fun areItemsTheSame(oldItem: AnnouncementsEmpty, newItem: AnnouncementsEmpty) = true override fun areContentsTheSame(oldItem: AnnouncementsEmpty, newItem: AnnouncementsEmpty) = true } @BindingAdapter("announcementTime", "timeZoneId") fun announcementTime( textView: TextView, announcementTime: ZonedDateTime, timeZoneId: ZoneId? ) { timeZoneId ?: return // TODO(gauravbhola): Show relative time '2 minutes ago', '1 hour ago' etc textView.text = TimeUtils.abbreviatedTimeForAnnouncements(TimeUtils.zonedTime(announcementTime, timeZoneId)) } ================================================ FILE: mobile/src/main/java/com/google/samples/apps/iosched/ui/feed/FeedFragment.kt ================================================ /* * Copyright 2019 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.ui.feed import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.core.view.WindowInsetsCompat import androidx.core.view.doOnLayout import androidx.core.view.isVisible import androidx.core.view.updatePadding import androidx.fragment.app.activityViewModels import androidx.fragment.app.viewModels import androidx.navigation.fragment.findNavController import androidx.recyclerview.widget.RecyclerView import com.google.common.collect.ImmutableMap import com.google.samples.apps.iosched.databinding.FragmentFeedBinding import com.google.samples.apps.iosched.model.SessionId import com.google.samples.apps.iosched.shared.analytics.AnalyticsHelper import com.google.samples.apps.iosched.ui.MainActivityViewModel import com.google.samples.apps.iosched.ui.MainNavigationFragment import com.google.samples.apps.iosched.ui.feed.FeedNavigationAction.NavigateAction import com.google.samples.apps.iosched.ui.feed.FeedNavigationAction.NavigateToScheduleAction import com.google.samples.apps.iosched.ui.feed.FeedNavigationAction.NavigateToSession import com.google.samples.apps.iosched.ui.feed.FeedNavigationAction.OpenLiveStreamAction import com.google.samples.apps.iosched.ui.feed.FeedNavigationAction.OpenSignInDialogAction import com.google.samples.apps.iosched.ui.messages.SnackbarMessageManager import com.google.samples.apps.iosched.ui.messages.setupSnackbarManager import com.google.samples.apps.iosched.ui.signin.SignInDialogFragment import com.google.samples.apps.iosched.ui.signin.setupProfileMenuItem import com.google.samples.apps.iosched.util.doOnApplyWindowInsets import com.google.samples.apps.iosched.util.launchAndRepeatWithViewLifecycle import com.google.samples.apps.iosched.util.openWebsiteUrl import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.flow.collect import javax.inject.Inject @AndroidEntryPoint class FeedFragment : MainNavigationFragment() { companion object { private const val DIALOG_NEED_TO_SIGN_IN = "dialog_need_to_sign_in" private const val BUNDLE_KEY_SESSIONS_LAYOUT_MANAGER_STATE = "sessions_layout_manager" } @Inject lateinit var snackbarMessageManager: SnackbarMessageManager @Inject lateinit var analyticsHelper: AnalyticsHelper private val model: FeedViewModel by viewModels() private val mainActivityViewModel: MainActivityViewModel by activityViewModels() private lateinit var binding: FragmentFeedBinding private var adapter: FeedAdapter? = null private lateinit var sessionsViewBinder: FeedSessionsViewBinder override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View { binding = FragmentFeedBinding.inflate( inflater, container, false ).apply { lifecycleOwner = viewLifecycleOwner viewModel = model } return binding.root } override fun onSaveInstanceState(outState: Bundle) { if (::sessionsViewBinder.isInitialized) { outState.putParcelable( BUNDLE_KEY_SESSIONS_LAYOUT_MANAGER_STATE, sessionsViewBinder.recyclerViewManagerState ) } super.onSaveInstanceState(outState) } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) analyticsHelper.sendScreenView("Home", requireActivity()) binding.toolbar.setupProfileMenuItem(mainActivityViewModel, viewLifecycleOwner) binding.root.doOnApplyWindowInsets { _, insets, _ -> val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars()) binding.statusBar.run { layoutParams.height = systemBars.top isVisible = layoutParams.height > 0 requestLayout() } } if (adapter == null) { // Initialising sessionsViewBinder here to handle config change. sessionsViewBinder = FeedSessionsViewBinder( model, savedInstanceState?.getParcelable( BUNDLE_KEY_SESSIONS_LAYOUT_MANAGER_STATE ) ) } binding.recyclerView.doOnApplyWindowInsets { v, insets, padding -> val systemInsets = insets.getInsets( WindowInsetsCompat.Type.systemBars() or WindowInsetsCompat.Type.ime() ) v.updatePadding(bottom = padding.bottom + systemInsets.bottom) } binding.snackbar.doOnApplyWindowInsets { v, insets, padding -> val systemInsets = insets.getInsets( WindowInsetsCompat.Type.systemBars() or WindowInsetsCompat.Type.ime() ) v.updatePadding(bottom = padding.bottom + systemInsets.bottom) } setupSnackbarManager(snackbarMessageManager, binding.snackbar) // Observe feed launchAndRepeatWithViewLifecycle { model.feed.collect { showFeedItems(binding.recyclerView, it) } } // Observe navigation events launchAndRepeatWithViewLifecycle { model.navigationActions.collect { action -> when (action) { is NavigateAction -> findNavController().navigate(action.directions) NavigateToScheduleAction -> findNavController().navigate(FeedFragmentDirections.toSchedule()) is NavigateToSession -> openSessionDetail(action.sessionId) is OpenLiveStreamAction -> openLiveStreamUrl(action.url) OpenSignInDialogAction -> openSignInDialog() } } } } private fun openSessionDetail(id: SessionId) { // TODO support opening a session detail // findNavController().navigate(toSessionDetail(id)) } private fun showFeedItems(recyclerView: RecyclerView, list: List?) { if (adapter == null) { val sectionHeaderViewBinder = FeedSectionHeaderViewBinder() val countdownViewBinder = CountdownViewBinder() val momentViewBinder = MomentViewBinder( eventListener = model, userInfo = model.userInfo, theme = model.theme ) val sessionsViewBinder = FeedSessionsViewBinder(model) val feedAnnouncementsHeaderViewBinder = AnnouncementsHeaderViewBinder(this, model) val announcementViewBinder = AnnouncementViewBinder(model.timeZoneId, this) val announcementsEmptyViewBinder = AnnouncementsEmptyViewBinder() val announcementsLoadingViewBinder = AnnouncementsLoadingViewBinder() val feedSustainabilitySectionViewBinder = FeedSustainabilitySectionViewBinder() val feedSocialChannelsSectionViewBinder = FeedSocialChannelsSectionViewBinder() @Suppress("UNCHECKED_CAST") val viewBinders = ImmutableMap.builder() .put( sectionHeaderViewBinder.modelClass, sectionHeaderViewBinder as FeedItemBinder ) .put( countdownViewBinder.modelClass, countdownViewBinder as FeedItemBinder ) .put( momentViewBinder.modelClass, momentViewBinder as FeedItemBinder ) .put( sessionsViewBinder.modelClass, sessionsViewBinder as FeedItemBinder ) .put( feedAnnouncementsHeaderViewBinder.modelClass, feedAnnouncementsHeaderViewBinder as FeedItemBinder ) .put( announcementViewBinder.modelClass, announcementViewBinder as FeedItemBinder ) .put( announcementsEmptyViewBinder.modelClass, announcementsEmptyViewBinder as FeedItemBinder ) .put( announcementsLoadingViewBinder.modelClass, announcementsLoadingViewBinder as FeedItemBinder ) .put( feedSustainabilitySectionViewBinder.modelClass, feedSustainabilitySectionViewBinder as FeedItemBinder ) .put( feedSocialChannelsSectionViewBinder.modelClass, feedSocialChannelsSectionViewBinder as FeedItemBinder ) .build() adapter = FeedAdapter(viewBinders) } if (recyclerView.adapter == null) { recyclerView.adapter = adapter } (recyclerView.adapter as FeedAdapter).submitList(list ?: emptyList()) // After submitting the list to the adapter, the recycler view starts measuring and drawing // so let's wait for the layout to be drawn before reporting fully drawn. binding.recyclerView.doOnLayout { // reportFullyDrawn() prints `I/ActivityTaskManager: Fully drawn {activity} {time}` // to logcat. The framework ensures that the statement is printed only once for the // activity, so there is no need to add dedupping logic to the app. activity?.reportFullyDrawn() } } private fun openSignInDialog() { SignInDialogFragment().show( requireActivity().supportFragmentManager, DIALOG_NEED_TO_SIGN_IN ) } private fun openLiveStreamUrl(url: String) { openWebsiteUrl(requireContext(), url) } } ================================================ FILE: mobile/src/main/java/com/google/samples/apps/iosched/ui/feed/FeedHeaderViewBinders.kt ================================================ /* * Copyright 2019 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.ui.feed import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.Button import androidx.core.view.isVisible import androidx.databinding.BindingAdapter import androidx.recyclerview.widget.RecyclerView.ViewHolder import com.google.android.material.button.MaterialButton import com.google.samples.apps.iosched.R import com.google.samples.apps.iosched.databinding.ItemFeedMomentBinding import com.google.samples.apps.iosched.model.Moment import com.google.samples.apps.iosched.model.Moment.Companion.CTA_LIVE_STREAM import com.google.samples.apps.iosched.model.Moment.Companion.CTA_MAP_LOCATION import com.google.samples.apps.iosched.model.Moment.Companion.CTA_SIGNIN import com.google.samples.apps.iosched.model.Theme import com.google.samples.apps.iosched.shared.data.signin.AuthenticatedUserInfo import com.google.samples.apps.iosched.util.executeAfter import kotlinx.coroutines.flow.StateFlow // Countdown is shown before the Keynote object CountdownItem class CountdownViewHolder(itemView: View) : ViewHolder(itemView) class CountdownViewBinder : FeedItemViewBinder( CountdownItem::class.java ) { override fun createViewHolder(parent: ViewGroup): CountdownViewHolder { return CountdownViewHolder( LayoutInflater.from(parent.context).inflate(getFeedItemType(), parent, false) ) } override fun bindViewHolder(model: CountdownItem, viewHolder: CountdownViewHolder) {} override fun getFeedItemType() = R.layout.item_feed_countdown override fun areItemsTheSame(oldItem: CountdownItem, newItem: CountdownItem) = true override fun areContentsTheSame(oldItem: CountdownItem, newItem: CountdownItem) = true } // A Moment may be shown during or after the conference based on the current time class MomentViewBinder( private val eventListener: FeedEventListener, private val userInfo: StateFlow, private val theme: StateFlow ) : FeedItemViewBinder(Moment::class.java) { override fun createViewHolder(parent: ViewGroup): MomentViewHolder { val binding = ItemFeedMomentBinding.inflate(LayoutInflater.from(parent.context), parent, false) return MomentViewHolder(binding, eventListener, userInfo, theme) } override fun bindViewHolder(model: Moment, viewHolder: MomentViewHolder) { viewHolder.bind(model) } override fun getFeedItemType(): Int = R.layout.item_feed_moment override fun areItemsTheSame(oldItem: Moment, newItem: Moment): Boolean = oldItem.id == newItem.id override fun areContentsTheSame(oldItem: Moment, newItem: Moment) = oldItem == newItem } class MomentViewHolder( private val binding: ItemFeedMomentBinding, private val eventListener: FeedEventListener, private val userInfo: StateFlow, private val theme: StateFlow ) : ViewHolder(binding.root) { fun bind(item: Moment) { binding.executeAfter { moment = item theme = theme userInfo = userInfo eventListener = this@MomentViewHolder.eventListener } } } @BindingAdapter("moment", "userInfo", "eventListener") fun setMomentActionButton( button: Button, moment: Moment?, userInfo: AuthenticatedUserInfo?, eventListener: FeedEventListener? ) { if (button !is MaterialButton) return moment ?: return eventListener ?: return val userSignedIn = userInfo?.isSignedIn() ?: false when (moment.ctaType) { CTA_LIVE_STREAM -> { val url = moment.streamUrl if (url.isNullOrEmpty()) { button.isVisible = false } else { button.apply { isVisible = true setText(R.string.feed_watch_live_stream) setOnClickListener { eventListener.openLiveStream(url) } setIconResource(R.drawable.ic_play_circle_outline) } } } CTA_MAP_LOCATION -> { button.apply { isVisible = true text = moment.featureName setOnClickListener { eventListener.openMap(moment) } setIconResource(R.drawable.ic_nav_map) } } CTA_SIGNIN -> { if (userSignedIn) { button.isVisible = false } else { button.apply { isVisible = true setText(R.string.sign_in) setOnClickListener { eventListener.signIn() } setIconResource(R.drawable.ic_default_profile_avatar) } } } else /* CTA_NO_ACTION */ -> button.isVisible = false } } ================================================ FILE: mobile/src/main/java/com/google/samples/apps/iosched/ui/feed/FeedSectionHeaderViewBinder.kt ================================================ /* * Copyright 2019 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.ui.feed import android.view.LayoutInflater import android.view.ViewGroup import androidx.recyclerview.widget.RecyclerView.ViewHolder import com.google.samples.apps.iosched.R import com.google.samples.apps.iosched.databinding.ItemGenericSectionHeaderBinding import com.google.samples.apps.iosched.ui.SectionHeader class FeedSectionHeaderViewBinder : FeedItemViewBinder(SectionHeader::class.java) { override fun createViewHolder(parent: ViewGroup): SectionHeaderViewHolder = SectionHeaderViewHolder( ItemGenericSectionHeaderBinding.inflate( LayoutInflater.from(parent.context), parent, false ) ) override fun bindViewHolder(model: SectionHeader, viewHolder: SectionHeaderViewHolder) { viewHolder.bind(model) } override fun getFeedItemType(): Int = R.layout.item_generic_section_header override fun areItemsTheSame(oldItem: SectionHeader, newItem: SectionHeader): Boolean = oldItem.titleId == newItem.titleId // This is called if [areItemsTheSame] is true, in which case we know the contents match. override fun areContentsTheSame(oldItem: SectionHeader, newItem: SectionHeader) = true } class SectionHeaderViewHolder( private val binding: ItemGenericSectionHeaderBinding ) : ViewHolder(binding.root) { fun bind(model: SectionHeader) { binding.sectionHeader = model } } ================================================ FILE: mobile/src/main/java/com/google/samples/apps/iosched/ui/feed/FeedSessionsViewBinder.kt ================================================ /* * Copyright 2019 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.ui.feed import android.os.Parcelable import android.view.LayoutInflater import android.view.ViewGroup import android.widget.TextView import androidx.annotation.StringRes import androidx.databinding.BindingAdapter import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.ListAdapter import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView.HORIZONTAL import androidx.recyclerview.widget.RecyclerView.LayoutManager import androidx.recyclerview.widget.RecyclerView.NO_POSITION import androidx.recyclerview.widget.RecyclerView.OnScrollListener import androidx.recyclerview.widget.RecyclerView.SCROLL_STATE_IDLE import androidx.recyclerview.widget.RecyclerView.ViewHolder import com.google.samples.apps.iosched.R import com.google.samples.apps.iosched.databinding.ItemFeedSessionBinding import com.google.samples.apps.iosched.databinding.ItemFeedSessionsContainerBinding import com.google.samples.apps.iosched.model.userdata.UserSession import com.google.samples.apps.iosched.shared.util.TimeUtils import com.google.samples.apps.iosched.ui.sessioncommon.SessionDiff import org.threeten.bp.ZoneId import org.threeten.bp.ZonedDateTime /** A data class representing the state of FeedSEssionsContainer */ data class FeedSessions( @StringRes val titleId: Int, @StringRes val actionTextId: Int, val userSessions: List, val timeZoneId: ZoneId = ZoneId.systemDefault(), val isMapFeatureEnabled: Boolean, val isLoading: Boolean ) class FeedSessionsViewBinder( private val eventListener: FeedEventListener, var recyclerViewManagerState: Parcelable? = null ) : FeedItemViewBinder(FeedSessions::class.java) { override fun createViewHolder(parent: ViewGroup): FeedSessionsViewHolder { val holder = FeedSessionsViewHolder( ItemFeedSessionsContainerBinding.inflate( LayoutInflater.from(parent.context), parent, false ), eventListener ) holder.binding.recyclerView.addOnScrollListener(object : OnScrollListener() { override fun onScrollStateChanged(recyclerView: RecyclerView, newState: Int) { super.onScrollStateChanged(recyclerView, newState) if (newState == SCROLL_STATE_IDLE) { saveInstanceState(holder) } } }) return holder } override fun bindViewHolder(model: FeedSessions, viewHolder: FeedSessionsViewHolder) { viewHolder.bind(model, recyclerViewManagerState) } override fun getFeedItemType(): Int = R.layout.item_feed_sessions_container override fun areItemsTheSame(oldItem: FeedSessions, newItem: FeedSessions): Boolean = true override fun areContentsTheSame(oldItem: FeedSessions, newItem: FeedSessions) = oldItem == newItem override fun onViewRecycled(viewHolder: FeedSessionsViewHolder) { saveInstanceState(viewHolder) } override fun onViewDetachedFromWindow(viewHolder: FeedSessionsViewHolder) { saveInstanceState(viewHolder) } fun saveInstanceState(viewHolder: FeedSessionsViewHolder) { if (viewHolder.adapterPosition == NO_POSITION) { return } recyclerViewManagerState = viewHolder.getLayoutManagerState() } } class FeedSessionsViewHolder( val binding: ItemFeedSessionsContainerBinding, private val eventListener: FeedEventListener ) : ViewHolder(binding.root) { private var layoutManager: LayoutManager? = null fun bind(sessions: FeedSessions, layoutManagerState: Parcelable?) { binding.sessionContainerState = sessions binding.eventListener = eventListener val sessionAdapter = FeedSessionAdapter( eventListener = eventListener, timeZoneId = sessions.timeZoneId, isMapFeatureEnabled = sessions.isMapFeatureEnabled ) binding.recyclerView.apply { layoutManager = LinearLayoutManager(context, HORIZONTAL, false) adapter = sessionAdapter } layoutManager = binding.recyclerView.layoutManager binding.actionButton.setOnClickListener { eventListener.openSchedule(true) } sessionAdapter.submitList(sessions.userSessions) if (layoutManagerState != null) { layoutManager?.onRestoreInstanceState(layoutManagerState) } binding.executePendingBindings() } fun getLayoutManagerState(): Parcelable? = layoutManager?.onSaveInstanceState() } /** Adapter which provides views for sessions inside the FeedSessionsContainer */ class FeedSessionAdapter( private val eventListener: FeedEventListener, private val timeZoneId: ZoneId, private val isMapFeatureEnabled: Boolean ) : ListAdapter(SessionDiff) { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): FeedSessionItemViewHolder { val binding = ItemFeedSessionBinding.inflate( LayoutInflater.from(parent.context), parent, false ) return FeedSessionItemViewHolder(binding, eventListener, timeZoneId, isMapFeatureEnabled) } override fun onBindViewHolder(holder: FeedSessionItemViewHolder, position: Int) { holder.bind(getItem(position)) } } /** ViewHolder for the sessions inside the FeedSessionsContainer */ class FeedSessionItemViewHolder( private val binding: ItemFeedSessionBinding, private val eventListener: FeedEventListener, private val timeZoneId: ZoneId, private val isMapFeatureEnabled: Boolean ) : ViewHolder(binding.root) { fun bind(userSession: UserSession) { binding.userSession = userSession binding.eventListener = eventListener binding.timeZoneId = timeZoneId binding.isMapFeatureEnabled = isMapFeatureEnabled } } @BindingAdapter("feedSessionStartTime", "feedSessionEndTime", "timeZoneId") fun sessionTime( textView: TextView, feedSessionStartTime: ZonedDateTime, feedSessionEndTime: ZonedDateTime, timeZoneId: ZoneId ) { textView.text = TimeUtils.timeString( TimeUtils.zonedTime(feedSessionStartTime, timeZoneId), TimeUtils.zonedTime(feedSessionEndTime, timeZoneId), withDate = false ) } ================================================ FILE: mobile/src/main/java/com/google/samples/apps/iosched/ui/feed/FeedSocialChannelsSectionViewBinder.kt ================================================ /* * Copyright 2020 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.ui.feed import android.text.SpannableString import android.text.SpannableStringBuilder import android.text.Spanned import android.text.style.ForegroundColorSpan import android.view.LayoutInflater import android.view.ViewGroup import androidx.recyclerview.widget.RecyclerView.ViewHolder import com.google.samples.apps.iosched.R import com.google.samples.apps.iosched.databinding.ItemFeedSocialChannelsBinding import com.google.samples.apps.iosched.util.getColorFromTheme object FeedSocialChannelsSection class FeedSocialChannelsSectionViewBinder : FeedItemViewBinder( FeedSocialChannelsSection::class.java ) { override fun createViewHolder(parent: ViewGroup): ViewHolder = FeedSocialChannelsSectionViewHolder( ItemFeedSocialChannelsBinding.inflate( LayoutInflater.from(parent.context), parent, false ) ) override fun bindViewHolder( model: FeedSocialChannelsSection, viewHolder: FeedSocialChannelsSectionViewHolder ) = viewHolder.bind() override fun getFeedItemType() = R.layout.item_feed_social_channels override fun areItemsTheSame( oldItem: FeedSocialChannelsSection, newItem: FeedSocialChannelsSection ) = true override fun areContentsTheSame( oldItem: FeedSocialChannelsSection, newItem: FeedSocialChannelsSection ) = true } class FeedSocialChannelsSectionViewHolder(val binding: ItemFeedSocialChannelsBinding) : ViewHolder(binding.root) { fun bind() { val titleText = SpannableStringBuilder() .append(SpannableString("#Google")) .append( SpannableString("IO") .apply { setSpan( ForegroundColorSpan( binding.root.context.getColorFromTheme(R.attr.colorPrimary) ), 0, length, Spanned.SPAN_INCLUSIVE_INCLUSIVE ) } ) binding.title.text = titleText } } ================================================ FILE: mobile/src/main/java/com/google/samples/apps/iosched/ui/feed/FeedSustainabilitySectionViewBinder.kt ================================================ /* * Copyright 2020 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.ui.feed import android.view.LayoutInflater import android.view.ViewGroup import androidx.recyclerview.widget.RecyclerView.ViewHolder import com.google.samples.apps.iosched.R import com.google.samples.apps.iosched.databinding.ItemFeedSustainabilityBinding object FeedSustainabilitySection class FeedSustainabilitySectionViewBinder : FeedItemViewBinder( FeedSustainabilitySection::class.java ) { override fun createViewHolder(parent: ViewGroup): ViewHolder = FeedSustainabilitySectionViewHolder( ItemFeedSustainabilityBinding.inflate( LayoutInflater.from(parent.context), parent, false ) ) override fun bindViewHolder( model: FeedSustainabilitySection, viewHolder: FeedSustainabilitySectionViewHolder ) = Unit override fun getFeedItemType() = R.layout.item_feed_sustainability override fun areItemsTheSame( oldItem: FeedSustainabilitySection, newItem: FeedSustainabilitySection ) = true override fun areContentsTheSame( oldItem: FeedSustainabilitySection, newItem: FeedSustainabilitySection ) = true } class FeedSustainabilitySectionViewHolder( binding: ItemFeedSustainabilityBinding ) : ViewHolder(binding.root) ================================================ FILE: mobile/src/main/java/com/google/samples/apps/iosched/ui/feed/FeedViewModel.kt ================================================ /* * Copyright 2019 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.ui.feed import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import androidx.navigation.NavDirections import com.google.samples.apps.iosched.R import com.google.samples.apps.iosched.model.Announcement import com.google.samples.apps.iosched.model.Moment import com.google.samples.apps.iosched.model.Session import com.google.samples.apps.iosched.model.SessionId import com.google.samples.apps.iosched.model.userdata.UserSession import com.google.samples.apps.iosched.shared.analytics.AnalyticsActions import com.google.samples.apps.iosched.shared.analytics.AnalyticsHelper import com.google.samples.apps.iosched.shared.data.signin.AuthenticatedUserInfo import com.google.samples.apps.iosched.shared.di.MapFeatureEnabledFlag import com.google.samples.apps.iosched.shared.di.ReservationEnabledFlag import com.google.samples.apps.iosched.shared.domain.feed.ConferenceState import com.google.samples.apps.iosched.shared.domain.feed.ConferenceState.ENDED import com.google.samples.apps.iosched.shared.domain.feed.ConferenceState.UPCOMING import com.google.samples.apps.iosched.shared.domain.feed.GetConferenceStateUseCase import com.google.samples.apps.iosched.shared.domain.feed.LoadAnnouncementsUseCase import com.google.samples.apps.iosched.shared.domain.feed.LoadCurrentMomentUseCase import com.google.samples.apps.iosched.shared.domain.sessions.LoadStarredAndReservedSessionsUseCase import com.google.samples.apps.iosched.shared.domain.settings.GetTimeZoneUseCase import com.google.samples.apps.iosched.shared.result.Result import com.google.samples.apps.iosched.shared.result.successOr import com.google.samples.apps.iosched.shared.time.TimeProvider import com.google.samples.apps.iosched.shared.util.TimeUtils import com.google.samples.apps.iosched.shared.util.TimeUtils.ConferenceDays import com.google.samples.apps.iosched.shared.util.toEpochMilli import com.google.samples.apps.iosched.shared.util.tryOffer import com.google.samples.apps.iosched.ui.messages.SnackbarMessage import com.google.samples.apps.iosched.ui.messages.SnackbarMessageManager import com.google.samples.apps.iosched.ui.sessioncommon.OnSessionClickListener import com.google.samples.apps.iosched.ui.sessioncommon.OnSessionStarClickListener import com.google.samples.apps.iosched.ui.signin.SignInViewModelDelegate import com.google.samples.apps.iosched.ui.theme.ThemedActivityDelegate import com.google.samples.apps.iosched.util.WhileViewSubscribed import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.channels.Channel import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.SharingStarted.Companion.Eagerly import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.flatMapLatest import kotlinx.coroutines.flow.flow import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.flow.receiveAsFlow import kotlinx.coroutines.flow.stateIn import org.threeten.bp.ZoneId import org.threeten.bp.ZonedDateTime import javax.inject.Inject /** * Loads data and exposes it to the view. * By annotating the constructor with [@Inject], Dagger will use that constructor when needing to * create the object, so defining a [@Provides] method for this class won't be needed. */ @HiltViewModel class FeedViewModel @Inject constructor( private val loadCurrentMomentUseCase: LoadCurrentMomentUseCase, loadAnnouncementsUseCase: LoadAnnouncementsUseCase, private val loadStarredAndReservedSessionsUseCase: LoadStarredAndReservedSessionsUseCase, getTimeZoneUseCase: GetTimeZoneUseCase, getConferenceStateUseCase: GetConferenceStateUseCase, private val timeProvider: TimeProvider, private val analyticsHelper: AnalyticsHelper, private val signInViewModelDelegate: SignInViewModelDelegate, themedActivityDelegate: ThemedActivityDelegate, private val snackbarMessageManager: SnackbarMessageManager ) : ViewModel(), FeedEventListener, ThemedActivityDelegate by themedActivityDelegate, SignInViewModelDelegate by signInViewModelDelegate { companion object { // Show at max 10 sessions in the horizontal sessions list as user can click on // View All sessions and go to schedule to view the full list private const val MAX_SESSIONS = 10 // Indicates there is no header to show at the current time. private object NoHeader // Indicates there is no sessions related display on the home screen as the conference is // over. private object NoSessionsContainer } @Inject @JvmField @ReservationEnabledFlag var isReservationEnabledByRemoteConfig: Boolean = false @Inject @JvmField @MapFeatureEnabledFlag var isMapEnabledByRemoteConfig: Boolean = false // Exposed to the view as a StateFlow but it's a one-shot operation. val timeZoneId = flow { if (getTimeZoneUseCase(Unit).successOr(true)) { emit(TimeUtils.CONFERENCE_TIMEZONE) } else { emit(ZoneId.systemDefault()) } }.stateIn(viewModelScope, Eagerly, TimeUtils.CONFERENCE_TIMEZONE) private val loadSessionsResult: StateFlow>> = signInViewModelDelegate.userId .flatMapLatest { // TODO(jdkoren): might need to show sessions for not signed in users too... loadStarredAndReservedSessionsUseCase(it) } .stateIn(viewModelScope, WhileViewSubscribed, Result.Loading) private val conferenceState: StateFlow = getConferenceStateUseCase(Unit) .onEach { if (it is Result.Error) { snackbarMessageManager.addMessage(SnackbarMessage(R.string.feed_loading_error)) } } .map { it.successOr(UPCOMING) } .stateIn(viewModelScope, WhileViewSubscribed, UPCOMING) // SIDE EFFECTS: Navigation actions private val _navigationActions = Channel(capacity = Channel.CONFLATED) // Exposed with receiveAsFlow to make sure that only one observer receives updates. val navigationActions = _navigationActions.receiveAsFlow() private val currentMomentResult: StateFlow> = conferenceState.map { // Reload if conferenceState changes loadCurrentMomentUseCase(timeProvider.now()) }.stateIn(viewModelScope, WhileViewSubscribed, Result.Loading) private val loadAnnouncementsResult: StateFlow>> = flow { emit(loadAnnouncementsUseCase(timeProvider.now())) }.onEach { if (it is Result.Error) { snackbarMessageManager.addMessage(SnackbarMessage(R.string.feed_loading_error)) } }.stateIn(viewModelScope, WhileViewSubscribed, Result.Loading) private val announcementsPreview: StateFlow> = loadAnnouncementsResult.map { val announcementsHeader = AnnouncementsHeader( showPastNotificationsButton = it.successOr(emptyList()).size > 1 ) if (it is Result.Loading) { listOf(announcementsHeader, LoadingIndicator) } else { listOf( announcementsHeader, it.successOr(emptyList()).firstOrNull() ?: AnnouncementsEmpty ) } }.stateIn(viewModelScope, WhileViewSubscribed, emptyList()) private val feedSessionsContainer: Flow = loadSessionsResult .combine(timeZoneId) { sessions, timeZone -> createFeedSessionsContainer(sessions, timeZone) } private val sessionContainer: StateFlow = combine( feedSessionsContainer, conferenceState, signInViewModelDelegate.userInfo ) { sessionsContainer: FeedSessions, conferenceState: ConferenceState, userInfo: AuthenticatedUserInfo? -> val isSignedIn = userInfo?.isSignedIn() ?: false val isRegistered = userInfo?.isRegistered() ?: false if (conferenceState != ENDED && isSignedIn && isRegistered && isReservationEnabledByRemoteConfig ) { sessionsContainer } else { NoSessionsContainer } }.stateIn(viewModelScope, WhileViewSubscribed, NoSessionsContainer) private val currentFeedHeader: StateFlow = conferenceState.combine( currentMomentResult ) { conferenceStarted: ConferenceState, momentResult -> if (conferenceStarted == UPCOMING) { CountdownItem } else { // Use case can return null even on success, so replace nulls with a sentinel momentResult.successOr(null) ?: NoHeader } }.stateIn(viewModelScope, WhileViewSubscribed, NoHeader) // TODO: Replace Any with something meaningful. val feed: StateFlow> = combine( currentFeedHeader, sessionContainer, announcementsPreview ) { feedHeader: Any, sessionContainer: Any, announcementsPreview: List -> val feedItems = mutableListOf() if (feedHeader != NoHeader) { feedItems.add(feedHeader) } if (sessionContainer != NoSessionsContainer) { feedItems.add(sessionContainer) } feedItems .plus(announcementsPreview) .plus(FeedSustainabilitySection) .plus(FeedSocialChannelsSection) }.stateIn(viewModelScope, WhileViewSubscribed, emptyList()) private fun createFeedSessionsContainer( sessionsResult: Result>, timeZoneId: ZoneId ): FeedSessions { val sessions = sessionsResult.successOr(emptyList()) val now = ZonedDateTime.ofInstant(timeProvider.now(), timeZoneId) // TODO: Making conferenceState a sealed class and moving currentDay in STARTED // state might be a better option val currentDayEndTime = TimeUtils.getCurrentConferenceDay()?.end // Treat start of the conference as endTime as sessions shouldn't be shown if the // currentConferenceDay is null ?: ConferenceDays.first().start val upcomingReservedSessions = sessions .filter { it.userEvent.isReserved() && it.session.endTime.isAfter(now) && it.session.endTime.isBefore(currentDayEndTime) } .take(MAX_SESSIONS) val titleId = R.string.feed_sessions_title val actionId = R.string.feed_view_full_schedule return FeedSessions( titleId = titleId, actionTextId = actionId, userSessions = upcomingReservedSessions, timeZoneId = timeZoneId, isLoading = sessionsResult is Result.Loading, isMapFeatureEnabled = isMapEnabledByRemoteConfig ) } override fun openEventDetail(id: SessionId) { analyticsHelper.logUiEvent( "Home to event detail", AnalyticsActions.HOME_TO_SESSION_DETAIL ) _navigationActions.tryOffer(FeedNavigationAction.NavigateToSession(id)) } override fun openSchedule(showOnlyPinnedSessions: Boolean) { analyticsHelper.logUiEvent("Home to Schedule", AnalyticsActions.HOME_TO_SCHEDULE) _navigationActions.tryOffer(FeedNavigationAction.NavigateToScheduleAction) } override fun onStarClicked(userSession: UserSession) { TODO("not implemented") } override fun signIn() { analyticsHelper.logUiEvent("Home to Sign In", AnalyticsActions.HOME_TO_SIGN_IN) _navigationActions.tryOffer(FeedNavigationAction.OpenSignInDialogAction) } override fun openMap(moment: Moment) { analyticsHelper.logUiEvent(moment.title.toString(), AnalyticsActions.HOME_TO_MAP) _navigationActions.tryOffer( FeedNavigationAction.NavigateAction( FeedFragmentDirections.toMap( featureId = moment.featureId, startTime = moment.startTime.toEpochMilli() ) ) ) } override fun openLiveStream(liveStreamUrl: String) { analyticsHelper.logUiEvent(liveStreamUrl, AnalyticsActions.HOME_TO_LIVESTREAM) _navigationActions.tryOffer(FeedNavigationAction.OpenLiveStreamAction(liveStreamUrl)) } override fun openMapForSession(session: Session) { analyticsHelper.logUiEvent(session.id, AnalyticsActions.HOME_TO_MAP) val directions = FeedFragmentDirections.toMap( featureId = session.room?.id, startTime = session.startTime.toEpochMilli() ) _navigationActions.tryOffer(FeedNavigationAction.NavigateAction(directions)) } override fun openPastAnnouncements() { analyticsHelper.logUiEvent("", AnalyticsActions.HOME_TO_ANNOUNCEMENTS) val directions = FeedFragmentDirections.toAnnouncementsFragment() _navigationActions.tryOffer(FeedNavigationAction.NavigateAction(directions)) } } interface FeedEventListener : OnSessionClickListener, OnSessionStarClickListener { fun openSchedule(showOnlyPinnedSessions: Boolean) fun signIn() fun openMap(moment: Moment) fun openLiveStream(liveStreamUrl: String) fun openMapForSession(session: Session) fun openPastAnnouncements() } sealed class FeedNavigationAction { class NavigateToSession(val sessionId: SessionId) : FeedNavigationAction() class NavigateAction(val directions: NavDirections) : FeedNavigationAction() object OpenSignInDialogAction : FeedNavigationAction() class OpenLiveStreamAction(val url: String) : FeedNavigationAction() object NavigateToScheduleAction : FeedNavigationAction() } ================================================ FILE: mobile/src/main/java/com/google/samples/apps/iosched/ui/filters/CloseableFilterChipAdapter.kt ================================================ /* * Copyright 2018 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.ui.filters import android.view.LayoutInflater import android.view.ViewGroup import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.ListAdapter import androidx.recyclerview.widget.RecyclerView.ViewHolder import com.google.samples.apps.iosched.databinding.ItemFilterChipCloseableBinding import com.google.samples.apps.iosched.ui.filters.CloseableFilterChipAdapter.FilterChipViewHolder import com.google.samples.apps.iosched.util.executeAfter // TODO(jdkoren): Maybe combine this with SelectableFilterChipAdapter /** Adapter for closeable filters, e.g. those shown above search results. */ class CloseableFilterChipAdapter( private val viewModelDelegate: FiltersViewModelDelegate ) : ListAdapter(FilterChipDiff) { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): FilterChipViewHolder { return FilterChipViewHolder( ItemFilterChipCloseableBinding.inflate( LayoutInflater.from(parent.context), parent, false ).apply { viewModel = viewModelDelegate } ) } override fun onBindViewHolder(holder: FilterChipViewHolder, position: Int) { holder.bind(getItem(position)) } class FilterChipViewHolder( private val binding: ItemFilterChipCloseableBinding ) : ViewHolder(binding.root) { fun bind(item: FilterChip) { binding.executeAfter { filterChip = item } } } } private object FilterChipDiff : DiffUtil.ItemCallback() { override fun areItemsTheSame(oldItem: FilterChip, newItem: FilterChip) = oldItem.filter == newItem.filter override fun areContentsTheSame(oldItem: FilterChip, newItem: FilterChip) = oldItem.isSelected == newItem.isSelected } ================================================ FILE: mobile/src/main/java/com/google/samples/apps/iosched/ui/filters/FilterChip.kt ================================================ /* * Copyright 2020 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.ui.filters import android.graphics.Color import com.google.samples.apps.iosched.R import com.google.samples.apps.iosched.model.Tag import com.google.samples.apps.iosched.model.filters.Filter import com.google.samples.apps.iosched.model.filters.Filter.DateFilter import com.google.samples.apps.iosched.model.filters.Filter.MyScheduleFilter import com.google.samples.apps.iosched.model.filters.Filter.TagFilter import com.google.samples.apps.iosched.shared.util.TimeUtils /** Wrapper model for showing [Filter] as a chip in the UI. */ data class FilterChip( val filter: Filter, val isSelected: Boolean, val categoryLabel: Int = 0, val color: Int = Color.parseColor("#4768fd"), // @color/indigo val selectedTextColor: Int = Color.WHITE, val textResId: Int = 0, val text: String = "" ) fun Filter.asChip(isSelected: Boolean): FilterChip = when (this) { is TagFilter -> FilterChip( filter = this, isSelected = isSelected, color = tag.color, text = tag.displayName, selectedTextColor = tag.fontColor ?: Color.TRANSPARENT, categoryLabel = tag.filterCategoryLabel() ) is DateFilter -> FilterChip( filter = this, isSelected = isSelected, textResId = TimeUtils.getShortLabelResForDay(day), categoryLabel = R.string.category_heading_dates ) MyScheduleFilter -> FilterChip( filter = this, isSelected = isSelected, textResId = R.string.my_events, categoryLabel = R.string.category_heading_dates ) } private fun Tag.filterCategoryLabel(): Int = when (this.category) { Tag.CATEGORY_TYPE -> R.string.category_heading_types Tag.CATEGORY_TOPIC -> R.string.category_heading_tracks Tag.CATEGORY_LEVEL -> R.string.category_heading_levels else -> 0 } ================================================ FILE: mobile/src/main/java/com/google/samples/apps/iosched/ui/filters/FiltersFragment.kt ================================================ /* * Copyright 2018 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.ui.filters import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.view.ViewGroup.MarginLayoutParams import androidx.activity.OnBackPressedCallback import androidx.core.view.WindowInsetsCompat import androidx.core.view.doOnLayout import androidx.core.view.marginBottom import androidx.core.view.updateLayoutParams import androidx.core.view.updatePadding import androidx.databinding.ObservableFloat import androidx.fragment.app.Fragment import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView.OnScrollListener import com.google.android.flexbox.FlexboxItemDecoration import com.google.samples.apps.iosched.R import com.google.samples.apps.iosched.databinding.FragmentFiltersBinding import com.google.samples.apps.iosched.util.doOnApplyWindowInsets import com.google.samples.apps.iosched.util.launchAndRepeatWithViewLifecycle import com.google.samples.apps.iosched.util.slideOffsetToAlpha import com.google.samples.apps.iosched.widget.BottomSheetBehavior import com.google.samples.apps.iosched.widget.BottomSheetBehavior.BottomSheetCallback import com.google.samples.apps.iosched.widget.BottomSheetBehavior.Companion.STATE_COLLAPSED import com.google.samples.apps.iosched.widget.BottomSheetBehavior.Companion.STATE_EXPANDED import com.google.samples.apps.iosched.widget.BottomSheetBehavior.Companion.STATE_HIDDEN import kotlinx.coroutines.flow.collect /** * Fragment that shows the list of filters for the Schedule */ abstract class FiltersFragment : Fragment() { companion object { // Threshold for when the filter sheet content should become invisible. // This should be a value between 0 and 1, coinciding with a point between the bottom // sheet's collapsed (0) and expanded (1) states. private const val ALPHA_CONTENT_START = 0.1f // Threshold for when the filter sheet content should become visible. // This should be a value between 0 and 1, coinciding with a point between the bottom // sheet's collapsed (0) and expanded (1) states. private const val ALPHA_CONTENT_END = 0.3f } private lateinit var viewModel: FiltersViewModelDelegate private lateinit var filterAdapter: SelectableFilterChipAdapter private lateinit var binding: FragmentFiltersBinding private lateinit var behavior: BottomSheetBehavior<*> private var contentAlpha = ObservableFloat(1f) private val backPressedCallback = object : OnBackPressedCallback(false) { override fun handleOnBackPressed() { if (::behavior.isInitialized && behavior.state == STATE_EXPANDED) { behavior.state = STATE_HIDDEN } } } private var pendingSheetState = -1 /** Resolve the [FiltersViewModelDelegate] for this instance. */ abstract fun resolveViewModelDelegate(): FiltersViewModelDelegate override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) requireActivity().onBackPressedDispatcher.addCallback(this, backPressedCallback) } override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? { binding = FragmentFiltersBinding.inflate(inflater, container, false).apply { lifecycleOwner = viewLifecycleOwner contentAlpha = this@FiltersFragment.contentAlpha } // Pad the bottom of the RecyclerView so that the content scrolls up above the nav bar binding.recyclerviewFilters.doOnApplyWindowInsets { v, insets, padding -> val systemInsets = insets.getInsets( WindowInsetsCompat.Type.systemBars() or WindowInsetsCompat.Type.ime() ) v.updatePadding(bottom = padding.bottom + systemInsets.bottom) } return binding.root } // In order to acquire the behavior associated with this sheet, we need to be attached to the // view hierarchy of our parent, otherwise we get an exception that our view is not a child of a // CoordinatorLayout. Therefore we do most initialization here instead of in onViewCreated(). override fun onActivityCreated(savedInstanceState: Bundle?) { super.onActivityCreated(savedInstanceState) viewModel = resolveViewModelDelegate() binding.viewModel = viewModel behavior = BottomSheetBehavior.from(binding.filterSheet) filterAdapter = SelectableFilterChipAdapter(viewModel) binding.recyclerviewFilters.apply { adapter = filterAdapter setHasFixedSize(true) itemAnimator = null addOnScrollListener(object : OnScrollListener() { override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) { binding.filtersHeaderShadow.isActivated = recyclerView.canScrollVertically(-1) } }) addItemDecoration( FlexboxItemDecoration(context).apply { setDrawable(context.getDrawable(R.drawable.divider_empty_margin_small)) setOrientation(FlexboxItemDecoration.VERTICAL) } ) } // Update the peek and margins so that it scrolls and rests within sys ui val peekHeight = behavior.peekHeight val marginBottom = binding.root.marginBottom binding.root.doOnApplyWindowInsets { v, insets, _ -> val gestureInsets = insets.getInsets(WindowInsetsCompat.Type.systemGestures()) // Update the peek height so that it is above the navigation bar behavior.peekHeight = gestureInsets.bottom + peekHeight v.updateLayoutParams { bottomMargin = marginBottom + gestureInsets.top } } behavior.addBottomSheetCallback(object : BottomSheetCallback { override fun onSlide(bottomSheet: View, slideOffset: Float) { updateFilterContentsAlpha(slideOffset) } override fun onStateChanged(bottomSheet: View, newState: Int) { updateBackPressedCallbackEnabled(newState) } }) binding.collapseArrow.setOnClickListener { behavior.state = if (behavior.skipCollapsed) STATE_HIDDEN else STATE_COLLAPSED } binding.filterSheet.doOnLayout { val slideOffset = when (behavior.state) { STATE_EXPANDED -> 1f STATE_COLLAPSED -> 0f else /*BottomSheetBehavior.STATE_HIDDEN*/ -> -1f } updateFilterContentsAlpha(slideOffset) } if (pendingSheetState != -1) { behavior.state = pendingSheetState pendingSheetState = -1 } updateBackPressedCallbackEnabled(behavior.state) } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) launchAndRepeatWithViewLifecycle { viewModel.filterChips.collect { filterAdapter.submitFilterList(it) } } } private fun updateFilterContentsAlpha(slideOffset: Float) { // Since the content is visible behind the navigation bar, apply a short alpha transition. contentAlpha.set( slideOffsetToAlpha(slideOffset, ALPHA_CONTENT_START, ALPHA_CONTENT_END) ) } private fun updateBackPressedCallbackEnabled(state: Int) { backPressedCallback.isEnabled = !(state == STATE_COLLAPSED || state == STATE_HIDDEN) } fun showFiltersSheet() { if (::behavior.isInitialized) { behavior.state = STATE_EXPANDED } else { pendingSheetState = STATE_EXPANDED } } fun hideFiltersSheet() { if (::behavior.isInitialized) { behavior.state = STATE_HIDDEN } else { pendingSheetState = STATE_HIDDEN } } } ================================================ FILE: mobile/src/main/java/com/google/samples/apps/iosched/ui/filters/FiltersViewBindingAdapters.kt ================================================ /* * Copyright 2020 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.ui.filters import android.content.res.ColorStateList import android.graphics.Color import android.widget.TextView import androidx.core.content.ContextCompat import androidx.databinding.BindingAdapter import androidx.recyclerview.widget.RecyclerView import com.google.android.material.chip.Chip import com.google.samples.apps.iosched.R import com.google.samples.apps.iosched.widget.SpaceDecoration @BindingAdapter("activeFilters", "viewModel", requireAll = true) fun activeFilters( recyclerView: RecyclerView, filters: List?, viewModel: FiltersViewModelDelegate ) { val filterChipAdapter: CloseableFilterChipAdapter if (recyclerView.adapter == null) { filterChipAdapter = CloseableFilterChipAdapter(viewModel) recyclerView.apply { adapter = filterChipAdapter val space = resources.getDimensionPixelSize(R.dimen.spacing_micro) addItemDecoration(SpaceDecoration(start = space, end = space)) } } else { filterChipAdapter = recyclerView.adapter as CloseableFilterChipAdapter } filterChipAdapter.submitList(filters ?: emptyList()) } @BindingAdapter("showResultCount", "resultCount", requireAll = true) fun filterHeader(textView: TextView, showResultCount: Boolean?, resultCount: Int?) { if (showResultCount == true && resultCount != null) { textView.text = textView.resources.getString(R.string.result_count, resultCount) } else { textView.setText(R.string.filters) } } @BindingAdapter("filterChipOnClick", "viewModel", requireAll = true) fun filterChipOnClick( chip: Chip, filterChip: FilterChip, viewModel: FiltersViewModelDelegate ) { chip.setOnClickListener { viewModel.toggleFilter(filterChip.filter, !filterChip.isSelected) } } @BindingAdapter("filterChipOnClose", "viewModel", requireAll = true) fun filterChipOnClose( chip: Chip, filterChip: FilterChip, viewModel: FiltersViewModelDelegate ) { chip.setOnCloseIconClickListener { viewModel.toggleFilter(filterChip.filter, false) } } @BindingAdapter("filterChipText") fun filterChipText(chip: Chip, filter: FilterChip) { if (filter.textResId != 0) { chip.setText(filter.textResId) } else { chip.text = filter.text } } @BindingAdapter("filterChipTint") fun filterChipTint(chip: Chip, color: Int) { val tintColor = if (color != Color.TRANSPARENT) { color } else { ContextCompat.getColor(chip.context, R.color.default_tag_color) } chip.chipIconTint = ColorStateList.valueOf(tintColor) } ================================================ FILE: mobile/src/main/java/com/google/samples/apps/iosched/ui/filters/FiltersViewModel.kt ================================================ /* * Copyright 2020 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.ui.filters import com.google.samples.apps.iosched.model.filters.Filter import com.google.samples.apps.iosched.util.compatRemoveIf import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.stateIn /** * Interface to add filters functionality to a screen through a ViewModel. */ interface FiltersViewModelDelegate { /** The full list of filter chips. */ val filterChips: Flow> /** The list of selected filters. */ val selectedFilters: StateFlow> /** The list of selected filter chips. */ val selectedFilterChips: StateFlow> /** True if there are any selected filters. */ val hasAnyFilters: StateFlow /** Number of results from applying filters. Can be set by implementers. */ val resultCount: MutableStateFlow /** Whether to show the result count instead of the "Filters" header. */ val showResultCount: StateFlow /** Set the list of filters. */ fun setSupportedFilters(filters: List) /** Set the selected state of the filter. Must be one of the supported filters. */ fun toggleFilter(filter: Filter, enabled: Boolean) /** Clear all selected filters. */ fun clearFilters() } class FiltersViewModelDelegateImpl( externalScope: CoroutineScope ) : FiltersViewModelDelegate { private val _filterChips = MutableStateFlow>(emptyList()) override val filterChips: Flow> = _filterChips private val _selectedFilters = MutableStateFlow>(emptyList()) override val selectedFilters: StateFlow> = _selectedFilters private val _selectedFilterChips = MutableStateFlow>(emptyList()) override val selectedFilterChips: StateFlow> = _selectedFilterChips override val hasAnyFilters = selectedFilterChips .map { it.isNotEmpty() } .stateIn(externalScope, SharingStarted.Lazily, false) override val resultCount = MutableStateFlow(0) // Default behavior: show count when there are active filters. override val showResultCount = hasAnyFilters // State for internal logic private var _filters = mutableListOf() private val _selectedFiltersList = mutableSetOf() private var _filterChipsList = mutableListOf() private var _selectedFilterChipsList = mutableListOf() override fun setSupportedFilters(filters: List) { // Remove orphaned filters val selectedChanged = _selectedFiltersList.compatRemoveIf { it !in filters } _filters = filters.toMutableList() _filterChipsList = _filters.mapTo(mutableListOf()) { it.asChip(it in _selectedFiltersList) } if (selectedChanged) { _selectedFilterChipsList = _filterChipsList.filterTo(mutableListOf()) { it.isSelected } } publish(selectedChanged) } private fun publish(selectedChanged: Boolean) { _filterChips.value = _filterChipsList if (selectedChanged) { _selectedFilters.value = _selectedFiltersList.toList() _selectedFilterChips.value = _selectedFilterChipsList } } override fun toggleFilter(filter: Filter, enabled: Boolean) { if (filter !in _filters) { throw IllegalArgumentException("Unsupported filter: $filter") } val changed = if (enabled) { _selectedFiltersList.add(filter) } else { _selectedFiltersList.remove(filter) } if (changed) { _selectedFilterChipsList = _selectedFiltersList.mapTo(mutableListOf()) { it.asChip(true) } val index = _filterChipsList.indexOfFirst { it.filter == filter } _filterChipsList[index] = filter.asChip(enabled) publish(true) } } override fun clearFilters() { if (_selectedFiltersList.isNotEmpty()) { _selectedFiltersList.clear() _selectedFilterChipsList.clear() _filterChipsList = _filterChipsList.mapTo(mutableListOf()) { if (it.isSelected) it.copy(isSelected = false) else it } publish(true) } } } ================================================ FILE: mobile/src/main/java/com/google/samples/apps/iosched/ui/filters/FiltersViewModelDelegateModule.kt ================================================ /* * Copyright 2020 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.ui.filters import com.google.samples.apps.iosched.shared.di.ApplicationScope import dagger.Module import dagger.Provides import dagger.hilt.InstallIn import dagger.hilt.components.SingletonComponent import kotlinx.coroutines.CoroutineScope @InstallIn(SingletonComponent::class) @Module class FiltersViewModelDelegateModule { @Provides fun provideFiltersViewModelDelegate( @ApplicationScope applicationScope: CoroutineScope ): FiltersViewModelDelegate = FiltersViewModelDelegateImpl(applicationScope) } ================================================ FILE: mobile/src/main/java/com/google/samples/apps/iosched/ui/filters/SelectableFilterChipAdapter.kt ================================================ /* * Copyright 2018 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.ui.filters import android.view.LayoutInflater import android.view.ViewGroup import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.ListAdapter import androidx.recyclerview.widget.RecyclerView.ViewHolder import com.google.samples.apps.iosched.R import com.google.samples.apps.iosched.databinding.ItemFilterChipSelectableBinding import com.google.samples.apps.iosched.databinding.ItemGenericSectionHeaderBinding import com.google.samples.apps.iosched.shared.util.exceptionInDebug import com.google.samples.apps.iosched.ui.SectionHeader /** Adapter for selectable filters, e.g. ones shown in the filter sheet. */ class SelectableFilterChipAdapter( private val viewModelDelegate: FiltersViewModelDelegate ) : ListAdapter(FilterChipAndHeadingDiff) { companion object { private const val VIEW_TYPE_HEADING = R.layout.item_generic_section_header private const val VIEW_TYPE_FILTER = R.layout.item_filter_chip_selectable /** * Inserts category headings in a list of [FilterChip]s to make a heterogeneous list. * Assumes the items are already grouped by [FilterChip.categoryLabel], beginning with * categoryLabel == '0'. */ private fun insertCategoryHeadings(list: List?): List { val newList = mutableListOf() var previousCategory = 0 list?.forEach { val category = it.categoryLabel if (category != previousCategory && category != 0) { newList += SectionHeader( titleId = category, useHorizontalPadding = false ) } newList.add(it) previousCategory = category } return newList } } override fun submitList(list: MutableList?) { exceptionInDebug( RuntimeException("call `submitEventFilterList()` instead to add category headings.") ) super.submitList(list) } /** Prefer this method over [submitList] to add category headings. */ fun submitFilterList(list: List?) { super.submitList(insertCategoryHeadings(list)) } override fun getItemViewType(position: Int): Int { return when (getItem(position)) { is SectionHeader -> VIEW_TYPE_HEADING is FilterChip -> VIEW_TYPE_FILTER else -> throw IllegalArgumentException("Unknown item type") } } override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { return when (viewType) { VIEW_TYPE_HEADING -> createHeadingViewHolder(parent) VIEW_TYPE_FILTER -> createFilterViewHolder(parent) else -> throw IllegalArgumentException("Unknown item type") } } private fun createHeadingViewHolder(parent: ViewGroup): HeadingViewHolder { return HeadingViewHolder( ItemGenericSectionHeaderBinding.inflate( LayoutInflater.from(parent.context), parent, false ) ) } private fun createFilterViewHolder(parent: ViewGroup): FilterViewHolder { val binding = ItemFilterChipSelectableBinding.inflate( LayoutInflater.from(parent.context), parent, false ).apply { viewModel = viewModelDelegate } return FilterViewHolder(binding) } override fun onBindViewHolder(holder: ViewHolder, position: Int) { when (holder) { is HeadingViewHolder -> holder.bind(getItem(position) as SectionHeader) is FilterViewHolder -> holder.bind(getItem(position) as FilterChip) } } /** ViewHolder for category heading items. */ class HeadingViewHolder( private val binding: ItemGenericSectionHeaderBinding ) : ViewHolder(binding.root) { internal fun bind(item: SectionHeader) { binding.sectionHeader = item binding.executePendingBindings() } } /** ViewHolder for [FilterChip] items. */ class FilterViewHolder(private val binding: ItemFilterChipSelectableBinding) : ViewHolder(binding.root) { internal fun bind(item: FilterChip) { binding.filterChip = item binding.executePendingBindings() } } } private object FilterChipAndHeadingDiff : DiffUtil.ItemCallback() { override fun areItemsTheSame(oldItem: Any, newItem: Any): Boolean { return when (oldItem) { is FilterChip -> newItem is FilterChip && newItem.filter == oldItem.filter else -> oldItem == newItem // SectionHeader } } override fun areContentsTheSame(oldItem: Any, newItem: Any): Boolean { return when (oldItem) { is FilterChip -> oldItem.isSelected == (newItem as FilterChip).isSelected else -> true } } } ================================================ FILE: mobile/src/main/java/com/google/samples/apps/iosched/ui/info/EventFragment.kt ================================================ /* * Copyright 2018 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.ui.info import android.content.Intent import android.net.Uri import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.View.GONE import android.view.View.VISIBLE import android.view.ViewGroup import android.widget.TextView import androidx.core.view.WindowInsetsCompat import androidx.core.view.updatePadding import androidx.databinding.BindingAdapter import androidx.fragment.app.Fragment import androidx.fragment.app.viewModels import com.google.samples.apps.iosched.R import com.google.samples.apps.iosched.databinding.FragmentInfoEventBinding import com.google.samples.apps.iosched.model.ConferenceWifiInfo import com.google.samples.apps.iosched.shared.di.AssistantAppEnabledFlag import com.google.samples.apps.iosched.shared.util.TimeUtils import com.google.samples.apps.iosched.ui.messages.SnackbarMessageManager import com.google.samples.apps.iosched.ui.messages.setupSnackbarManager import com.google.samples.apps.iosched.util.doOnApplyWindowInsets import com.google.samples.apps.iosched.util.launchAndRepeatWithViewLifecycle import com.google.samples.apps.iosched.widget.FadingSnackbar import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.flow.collect import javax.inject.Inject @AndroidEntryPoint class EventFragment : Fragment() { @Inject lateinit var snackbarMessageManager: SnackbarMessageManager @Inject @JvmField @AssistantAppEnabledFlag var assistantAppEnabled = false private val eventInfoViewModel: EventInfoViewModel by viewModels() override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? { context ?: return null val binding = FragmentInfoEventBinding.inflate(inflater, container, false).apply { viewModel = eventInfoViewModel showAssistantApp = assistantAppEnabled lifecycleOwner = viewLifecycleOwner } // Pad the bottom of the content so that it is above the nav bar binding.content.doOnApplyWindowInsets { v, insets, padding -> val systemInsets = insets.getInsets( WindowInsetsCompat.Type.systemBars() or WindowInsetsCompat.Type.ime() ) v.updatePadding(bottom = padding.bottom + systemInsets.bottom) } val snackbarLayout = requireActivity().findViewById(R.id.snackbar) setupSnackbarManager(snackbarMessageManager, snackbarLayout) return binding.root } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) launchAndRepeatWithViewLifecycle { eventInfoViewModel.navigationActions.collect { event -> when (event) { is EventInfoNavigationAction.OpenUrl -> { startActivity(Intent(Intent.ACTION_VIEW, Uri.parse(event.url))) } } } } } } @BindingAdapter("countdownVisibility") fun countdownVisibility(countdown: View, ignored: Boolean?) { // TODO Remove this method since ignored is unused countdown.visibility = if (TimeUtils.conferenceHasStarted()) GONE else VISIBLE } @BindingAdapter("wifiInfo") fun bindWifiInfo(textView: TextView, wifiInfo: ConferenceWifiInfo?) { textView.text = if (wifiInfo == null) null else { textView.resources.getString( R.string.wifi_network_and_password, wifiInfo.ssid, wifiInfo.password ) } } ================================================ FILE: mobile/src/main/java/com/google/samples/apps/iosched/ui/info/EventInfoViewModel.kt ================================================ /* * Copyright 2018 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.ui.info import android.net.wifi.WifiConfiguration import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.google.samples.apps.iosched.R import com.google.samples.apps.iosched.model.ConferenceWifiInfo import com.google.samples.apps.iosched.shared.analytics.AnalyticsActions import com.google.samples.apps.iosched.shared.analytics.AnalyticsHelper import com.google.samples.apps.iosched.shared.domain.logistics.LoadWifiInfoUseCase import com.google.samples.apps.iosched.shared.result.data import com.google.samples.apps.iosched.shared.util.tryOffer import com.google.samples.apps.iosched.ui.messages.SnackbarMessage import com.google.samples.apps.iosched.ui.messages.SnackbarMessageManager import com.google.samples.apps.iosched.util.WhileViewSubscribed import com.google.samples.apps.iosched.util.wifi.WifiInstaller import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.channels.Channel import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.flow import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.receiveAsFlow import kotlinx.coroutines.flow.stateIn import javax.inject.Inject @HiltViewModel class EventInfoViewModel @Inject constructor( loadWifiInfoUseCase: LoadWifiInfoUseCase, private val wifiInstaller: WifiInstaller, private val analyticsHelper: AnalyticsHelper, private val snackbarMessageManager: SnackbarMessageManager ) : ViewModel() { companion object { private const val ASSISTANT_APP_URL = "https://assistant.google.com/services/invoke/uid/0000009fca77b068" } val wifiConfig: StateFlow = flow { emit(loadWifiInfoUseCase(Unit).data) }.stateIn(viewModelScope, SharingStarted.Lazily, null) val showWifi: StateFlow = wifiConfig.map { it?.ssid?.isNotBlank() == true && it.password.isNotBlank() }.stateIn(viewModelScope, WhileViewSubscribed, false) private val _navigationActions = Channel(Channel.CONFLATED) val navigationActions = _navigationActions.receiveAsFlow() fun onWifiConnect() { val config = wifiConfig.value ?: return val success = wifiInstaller.installConferenceWifi( WifiConfiguration().apply { SSID = config.ssid preSharedKey = config.password } ) val snackbarMessage = if (success) { SnackbarMessage(R.string.wifi_install_success) } else { SnackbarMessage( messageId = R.string.wifi_install_clipboard_message, longDuration = true ) } snackbarMessageManager.addMessage(snackbarMessage) analyticsHelper.logUiEvent("Events", AnalyticsActions.WIFI_CONNECT) } fun onClickAssistantApp() { _navigationActions.tryOffer(EventInfoNavigationAction.OpenUrl(ASSISTANT_APP_URL)) analyticsHelper.logUiEvent("Assistant App", AnalyticsActions.CLICK) } } sealed class EventInfoNavigationAction { data class OpenUrl(val url: String) : EventInfoNavigationAction() } ================================================ FILE: mobile/src/main/java/com/google/samples/apps/iosched/ui/info/FaqFragment.kt ================================================ /* * Copyright 2019 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.ui.info import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.core.view.WindowInsetsCompat import androidx.core.view.updatePadding import androidx.fragment.app.Fragment import com.google.samples.apps.iosched.R import com.google.samples.apps.iosched.util.doOnApplyWindowInsets import dagger.hilt.android.AndroidEntryPoint @AndroidEntryPoint class FaqFragment : Fragment() { override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? { return inflater.inflate(R.layout.fragment_info_faq, container, false) } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) // Pad the bottom of the ScrollView so that the content scrolls up past any system bars. view.doOnApplyWindowInsets { v, insets, padding -> val systemInsets = insets.getInsets( WindowInsetsCompat.Type.systemBars() or WindowInsetsCompat.Type.ime() ) v.updatePadding(bottom = padding.bottom + systemInsets.bottom) } } } ================================================ FILE: mobile/src/main/java/com/google/samples/apps/iosched/ui/info/InfoFragment.kt ================================================ /* * Copyright 2018 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.ui.info import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.core.view.WindowInsetsCompat import androidx.core.view.updatePadding import androidx.fragment.app.Fragment import androidx.fragment.app.viewModels import androidx.viewpager2.adapter.FragmentStateAdapter import androidx.viewpager2.widget.ViewPager2.OnPageChangeCallback import com.google.android.material.tabs.TabLayoutMediator import com.google.samples.apps.iosched.R import com.google.samples.apps.iosched.databinding.FragmentInfoBinding import com.google.samples.apps.iosched.shared.analytics.AnalyticsHelper import com.google.samples.apps.iosched.ui.MainActivityViewModel import com.google.samples.apps.iosched.ui.MainNavigationFragment import com.google.samples.apps.iosched.ui.signin.setupProfileMenuItem import com.google.samples.apps.iosched.util.doOnApplyWindowInsets import dagger.hilt.android.AndroidEntryPoint import javax.inject.Inject @AndroidEntryPoint class InfoFragment : MainNavigationFragment() { @Inject lateinit var analyticsHelper: AnalyticsHelper private lateinit var binding: FragmentInfoBinding private val viewModel: MainActivityViewModel by viewModels() override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? { binding = FragmentInfoBinding.inflate(inflater, container, false).apply { lifecycleOwner = viewLifecycleOwner } binding.viewpager.doOnApplyWindowInsets { v, insets, padding -> val systemInsets = insets.getInsets( WindowInsetsCompat.Type.systemBars() or WindowInsetsCompat.Type.ime() ) v.updatePadding(bottom = padding.bottom + systemInsets.bottom) } return binding.root } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) binding.run { toolbar.setupProfileMenuItem(viewModel, viewLifecycleOwner) viewpager.offscreenPageLimit = INFO_PAGES.size viewpager.adapter = InfoAdapter(this@InfoFragment) TabLayoutMediator(tabs, viewpager) { tab, position -> tab.text = resources.getString(INFO_TITLES[position]) }.attach() // Analytics. Manually fire once for the loaded tab, then fire on tab change. trackInfoScreenView(0) viewpager.registerOnPageChangeCallback(object : OnPageChangeCallback() { override fun onPageSelected(position: Int) { trackInfoScreenView(position) } }) } } private fun trackInfoScreenView(position: Int) { val pageName = getString(INFO_TITLES[position]) analyticsHelper.sendScreenView("Info - $pageName", requireActivity()) } /** * Adapter that builds a page for each info screen. */ inner class InfoAdapter(fragment: Fragment) : FragmentStateAdapter(fragment) { override fun createFragment(position: Int) = INFO_PAGES[position].invoke() override fun getItemCount() = INFO_PAGES.size } companion object { private val INFO_TITLES = arrayOf( R.string.event_title, R.string.travel_title, R.string.faq_title ) private val INFO_PAGES = arrayOf( { EventFragment() }, { TravelFragment() }, { FaqFragment() } // TODO: Track the InfoPage performance b/130335745 ) } } ================================================ FILE: mobile/src/main/java/com/google/samples/apps/iosched/ui/info/TravelFragment.kt ================================================ /* * Copyright 2018 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.ui.info import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.core.view.WindowInsetsCompat import androidx.core.view.updatePadding import androidx.fragment.app.Fragment import com.google.samples.apps.iosched.R import com.google.samples.apps.iosched.util.doOnApplyWindowInsets import dagger.hilt.android.AndroidEntryPoint @AndroidEntryPoint class TravelFragment : Fragment() { override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? { return inflater.inflate(R.layout.fragment_info_travel, container, false) } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) // Pad the bottom of the ScrollView so that it scrolls up above the nav bar view.doOnApplyWindowInsets { v, insets, padding -> val systemInsets = insets.getInsets( WindowInsetsCompat.Type.systemBars() or WindowInsetsCompat.Type.ime() ) v.updatePadding(bottom = padding.bottom + systemInsets.bottom) } } } ================================================ FILE: mobile/src/main/java/com/google/samples/apps/iosched/ui/map/LoadGeoJsonFeaturesUseCase.kt ================================================ /* * Copyright 2018 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.ui.map import android.content.Context import android.text.TextUtils import com.google.android.gms.maps.GoogleMap import com.google.maps.android.data.geojson.GeoJsonFeature import com.google.maps.android.data.geojson.GeoJsonLayer import com.google.maps.android.ktx.utils.geojson.geoJsonLayer import com.google.samples.apps.iosched.shared.di.IoDispatcher import com.google.samples.apps.iosched.shared.domain.UseCase import dagger.hilt.android.qualifiers.ApplicationContext import kotlinx.coroutines.CoroutineDispatcher import javax.inject.Inject /** Parameters for this use case. */ typealias LoadGeoJsonParams = Pair /** Data loaded by this use case. */ data class GeoJsonData( val geoJsonLayer: GeoJsonLayer, val featureMap: Map ) /** Use case that loads a GeoJsonLayer and its features. */ class LoadGeoJsonFeaturesUseCase @Inject constructor( @ApplicationContext private val context: Context, @IoDispatcher dispatcher: CoroutineDispatcher ) : UseCase(dispatcher) { override suspend fun execute(parameters: LoadGeoJsonParams): GeoJsonData { val (googleMap, markersRes) = parameters val layer = geoJsonLayer( map = googleMap, resourceId = markersRes, context = context ) processGeoJsonLayer(layer, context) return GeoJsonData(layer, buildFeatureMap(layer)) } private fun buildFeatureMap(layer: GeoJsonLayer): Map { val featureMap: MutableMap = mutableMapOf() layer.features.forEach { val id = it.id if (!TextUtils.isEmpty(id)) { // Marker can map to multiple room IDs for (part in id.split(",")) { featureMap[part] = it } } } return featureMap } } ================================================ FILE: mobile/src/main/java/com/google/samples/apps/iosched/ui/map/MapFragment.kt ================================================ /* * Copyright 2018 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.ui.map import android.Manifest import android.app.Dialog import android.content.pm.PackageManager import android.os.Bundle import android.text.Html import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.view.ViewGroup.MarginLayoutParams import androidx.activity.addCallback import androidx.constraintlayout.widget.ConstraintLayout import androidx.core.content.ContextCompat import androidx.core.view.WindowInsetsCompat import androidx.core.view.isVisible import androidx.core.view.marginBottom import androidx.core.view.updateLayoutParams import androidx.core.view.updatePadding import androidx.core.widget.NestedScrollView import androidx.fragment.app.DialogFragment import androidx.fragment.app.activityViewModels import androidx.fragment.app.viewModels import androidx.lifecycle.lifecycleScope import com.google.android.gms.maps.MapView import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.maps.android.data.geojson.GeoJsonLayer import com.google.maps.android.ktx.awaitMap import com.google.samples.apps.iosched.R import com.google.samples.apps.iosched.databinding.FragmentMapBinding import com.google.samples.apps.iosched.shared.analytics.AnalyticsHelper import com.google.samples.apps.iosched.ui.MainActivityViewModel import com.google.samples.apps.iosched.ui.MainNavigationFragment import com.google.samples.apps.iosched.ui.signin.setupProfileMenuItem import com.google.samples.apps.iosched.util.doOnApplyWindowInsets import com.google.samples.apps.iosched.util.launchAndRepeatWithViewLifecycle import com.google.samples.apps.iosched.util.slideOffsetToAlpha import com.google.samples.apps.iosched.widget.BottomSheetBehavior import com.google.samples.apps.iosched.widget.BottomSheetBehavior.BottomSheetCallback import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.flow.collect import kotlinx.coroutines.launch import org.threeten.bp.Instant import javax.inject.Inject @AndroidEntryPoint class MapFragment : MainNavigationFragment() { @Inject lateinit var analyticsHelper: AnalyticsHelper private val viewModel: MapViewModel by viewModels() private val mainActivityViewModel: MainActivityViewModel by activityViewModels() private var mapViewBundle: Bundle? = null private lateinit var mapView: MapView private lateinit var binding: FragmentMapBinding private lateinit var bottomSheetBehavior: BottomSheetBehavior<*> private var fabBaseMarginBottom = 0 companion object { private const val FRAGMENT_MY_LOCATION_RATIONALE = "my_location_rationale" private const val MAPVIEW_BUNDLE_KEY = "MapViewBundleKey" private const val ARG_FEATURE_ID = "arg.FEATURE_ID" private const val ARG_FEATURE_START_TIME = "arg.FEATURE_START_TIME" private const val REQUEST_LOCATION_PERMISSION = 1 // Threshold for when the marker description reaches maximum alpha. Should be a value // between 0 and 1, inclusive, coinciding with a point between the bottom sheet's // collapsed (0) and expanded (1) states. private const val ALPHA_TRANSITION_END = 0.5f // Threshold for when the marker description reaches minimum alpha. Should be a value // between 0 and 1, inclusive, coinciding with a point between the bottom sheet's // collapsed (0) and expanded (1) states. private const val ALPHA_TRANSITION_START = 0.1f fun newInstance(featureId: String, featureStartTime: Long): MapFragment { return MapFragment().apply { arguments = Bundle().apply { putString(ARG_FEATURE_ID, featureId) putLong(ARG_FEATURE_START_TIME, featureStartTime) } } } } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) if (savedInstanceState != null) { mapViewBundle = savedInstanceState.getBundle(MAPVIEW_BUNDLE_KEY) } requireActivity().onBackPressedDispatcher.addCallback(this) { onBackPressed() } } override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? { binding = FragmentMapBinding.inflate(inflater, container, false).apply { lifecycleOwner = viewLifecycleOwner viewModel = this@MapFragment.viewModel } mapView = binding.map.apply { onCreate(mapViewBundle) } if (savedInstanceState == null) { MapFragmentArgs.fromBundle(arguments ?: Bundle.EMPTY).let { it -> if (!it.featureId.isNullOrEmpty()) { viewModel.requestHighlightFeature(it.featureId) } val variant = when { it.mapVariant != null -> MapVariant.valueOf(it.mapVariant) it.startTime > 0L -> MapVariant.forTime(Instant.ofEpochMilli(it.startTime)) else -> MapVariant.forTime() } viewModel.setMapVariant(variant) } } return binding.root } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) fabBaseMarginBottom = binding.mapModeFab.marginBottom binding.toolbar.run { setupProfileMenuItem(mainActivityViewModel, viewLifecycleOwner) menu.findItem(R.id.action_my_location)?.let { item -> launchAndRepeatWithViewLifecycle { viewModel.showMyLocationOption.collect { option -> item.isVisible = option } } } setOnMenuItemClickListener { item -> if (item.itemId == R.id.action_my_location) { enableMyLocation(true) true } else { false } } } bottomSheetBehavior = BottomSheetBehavior.from(binding.bottomSheet) val bottomSheetCallback = object : BottomSheetCallback { override fun onStateChanged(bottomSheet: View, newState: Int) { // Orient the expand/collapse icon accordingly val rotation = when (newState) { BottomSheetBehavior.STATE_EXPANDED -> 0f BottomSheetBehavior.STATE_COLLAPSED -> 180f BottomSheetBehavior.STATE_HIDDEN -> 180f else -> return } binding.expandIcon.animate().rotationX(rotation).start() // Analytics if (newState == BottomSheetBehavior.STATE_EXPANDED) { viewModel.logViewedMarkerDetails() } } override fun onSlide(bottomSheet: View, slideOffset: Float) { // Due to content being visible beneath the navigation bar, apply a short alpha // transition binding.descriptionScrollview.alpha = slideOffsetToAlpha(slideOffset, ALPHA_TRANSITION_START, ALPHA_TRANSITION_END) if (slideOffset > 0f) { binding.mapModeFab.hide() } else { binding.mapModeFab.show() // Translate FAB to make room for the peeking sheet. val ty = (bottomSheet.top - fabBaseMarginBottom - binding.mapModeFab.bottom) .coerceAtMost(0) binding.mapModeFab.translationY = ty.toFloat() } } } bottomSheetBehavior.addBottomSheetCallback(bottomSheetCallback) // Trigger the callbacks once on layout to set the state of the sheet content & FAB. binding.bottomSheet.post { val state = bottomSheetBehavior.state val slideOffset = when (state) { BottomSheetBehavior.STATE_EXPANDED -> 1f BottomSheetBehavior.STATE_COLLAPSED -> 0f else -> -1f // BottomSheetBehavior.STATE_HIDDEN } bottomSheetCallback.onStateChanged(binding.bottomSheet, state) bottomSheetCallback.onSlide(binding.bottomSheet, slideOffset) } val originalPeekHeight = bottomSheetBehavior.peekHeight binding.root.doOnApplyWindowInsets { _, insets, _ -> val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars()) binding.statusBar.updateLayoutParams { height = systemBars.top } binding.statusBar.isVisible = true binding.statusBar.requestLayout() // Update the Map padding so that the copyright, etc is not displayed in nav bar viewLifecycleOwner.lifecycleScope.launch { val map = binding.map.awaitMap() map.setPadding(0, 0, 0, systemBars.bottom) } binding.mapModeFab.updateLayoutParams { bottomMargin = fabBaseMarginBottom + systemBars.bottom } binding.descriptionScrollview.updatePadding(bottom = systemBars.bottom) // The peek height should use the bottom system gesture inset since it is a scrolling // widget val gestureInsets = insets.getInsets(WindowInsetsCompat.Type.systemGestures()) bottomSheetBehavior.peekHeight = gestureInsets.bottom + originalPeekHeight } // Make the header clickable. binding.clickable.setOnClickListener { if (bottomSheetBehavior.state == BottomSheetBehavior.STATE_COLLAPSED) { bottomSheetBehavior.state = BottomSheetBehavior.STATE_EXPANDED } else { bottomSheetBehavior.state = BottomSheetBehavior.STATE_COLLAPSED } } // Mimic elevation change by activating header shadow. binding.descriptionScrollview .setOnScrollChangeListener { v: NestedScrollView, _: Int, _: Int, _: Int, _: Int -> binding.sheetHeaderShadow.isActivated = v.canScrollVertically(-1) } binding.mapModeFab.setOnClickListener { MapVariantSelectionDialogFragment().show(childFragmentManager, "MAP_MODE_DIALOG") } // Initialize MapView viewLifecycleOwner.lifecycleScope.launch { mapView.awaitMap().apply { setOnMapClickListener { viewModel.dismissFeatureDetails() } setOnCameraMoveListener { viewModel.onZoomChanged(cameraPosition.zoom) } enableMyLocation() } } launchAndRepeatWithViewLifecycle { launch { // Observe ViewModel data viewModel.mapVariant.collect { mapView.awaitMap().apply { clear() viewModel.loadMapFeatures(this) } } } // Set the center of the map's camera. Call this every time the user selects a marker. launch { viewModel.mapCenterEvent.collect { update -> mapView.getMapAsync { it.animateCamera(update) } } } launch { viewModel.bottomSheetStateEvent.collect { event -> BottomSheetBehavior.from(binding.bottomSheet).state = event } } launch { viewModel.geoJsonLayer.collect { it?.let { updateMarkers(it) } } } launch { viewModel.selectedMarkerInfo.collect { it?.let { updateInfoSheet(it) } } } } analyticsHelper.sendScreenView("Map", requireActivity()) } private fun updateInfoSheet(markerInfo: MarkerInfo) { val iconRes = getDrawableResourceForIcon(binding.markerIcon.context, markerInfo.iconName) binding.markerIcon.apply { setImageResource(iconRes) visibility = if (iconRes == 0) View.GONE else View.VISIBLE } binding.markerTitle.text = markerInfo.title binding.markerSubtitle.apply { text = markerInfo.subtitle isVisible = !markerInfo.subtitle.isNullOrEmpty() } val description = Html.fromHtml(markerInfo.description ?: "") val hasDescription = description.isNotEmpty() binding.markerDescription.apply { text = description isVisible = hasDescription } // Hide/disable expansion affordances when there is no description. binding.expandIcon.isVisible = hasDescription binding.clickable.isVisible = hasDescription } private fun onBackPressed(): Boolean { if (::bottomSheetBehavior.isInitialized && bottomSheetBehavior.state == BottomSheetBehavior.STATE_EXPANDED ) { bottomSheetBehavior.state = BottomSheetBehavior.STATE_COLLAPSED return true } return false } override fun onSaveInstanceState(outState: Bundle) { super.onSaveInstanceState(outState) val mapViewBundle = outState.getBundle(MAPVIEW_BUNDLE_KEY) ?: Bundle().apply { putBundle(MAPVIEW_BUNDLE_KEY, this) } mapView.onSaveInstanceState(mapViewBundle) } override fun onResume() { super.onResume() mapView.onResume() } override fun onStart() { super.onStart() mapView.onStart() } override fun onStop() { super.onStop() mapView.onStop() } override fun onPause() { super.onPause() mapView.onPause() } override fun onDestroy() { super.onDestroy() mapView.onDestroy() viewModel.onMapDestroyed() } override fun onLowMemory() { super.onLowMemory() mapView.onLowMemory() } private fun updateMarkers(geoJsonLayer: GeoJsonLayer) { geoJsonLayer.addLayerToMap() geoJsonLayer.setOnFeatureClickListener { feature -> // Feature ID can be a comma-separated list. In that case use only the first ID. viewModel.requestHighlightFeature(feature.id.split(",")[0]) } } private fun requestLocationPermission() { val context = context ?: return if (ContextCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED ) { return } if (shouldShowRequestPermissionRationale(Manifest.permission.ACCESS_FINE_LOCATION)) { MyLocationRationaleFragment() .show(childFragmentManager, FRAGMENT_MY_LOCATION_RATIONALE) return } requestPermissions( arrayOf(Manifest.permission.ACCESS_FINE_LOCATION), REQUEST_LOCATION_PERMISSION ) } override fun onRequestPermissionsResult( requestCode: Int, permissions: Array, grantResults: IntArray ) { if (requestCode == REQUEST_LOCATION_PERMISSION) { if (grantResults.size == 1 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { enableMyLocation() } else { MyLocationRationaleFragment() .show(childFragmentManager, FRAGMENT_MY_LOCATION_RATIONALE) } } else { super.onRequestPermissionsResult(requestCode, permissions, grantResults) } } private fun enableMyLocation(requestPermission: Boolean = false) { val context = context ?: return when { ContextCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED -> { lifecycleScope.launch { val map = mapView.awaitMap() map.isMyLocationEnabled = true } viewModel.optIntoMyLocation() } requestPermission -> requestLocationPermission() else -> viewModel.optIntoMyLocation(false) } } class MyLocationRationaleFragment : DialogFragment() { override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { return MaterialAlertDialogBuilder(requireContext()) .setMessage(R.string.my_location_rationale) .setPositiveButton(android.R.string.ok) { _, _ -> requireParentFragment().requestPermissions( arrayOf(Manifest.permission.ACCESS_FINE_LOCATION), REQUEST_LOCATION_PERMISSION ) } .setNegativeButton(android.R.string.cancel, null) // Give up .create() } } } ================================================ FILE: mobile/src/main/java/com/google/samples/apps/iosched/ui/map/MapTileProvider.kt ================================================ /* * Copyright 2019 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.ui.map import com.google.android.gms.maps.model.UrlTileProvider import com.google.samples.apps.iosched.BuildConfig import java.net.URL class MapTileProvider( private val tileSize: Int, private val variant: MapVariant ) : UrlTileProvider(tileSize, tileSize) { companion object { // Order of format arguments: variant name, tile size, zoom level, tile x, tile y private const val BASE_URL = BuildConfig.MAP_TILE_URL_BASE + "/%s/%d/%d/%d_%d.png" private const val BASE_TILE_SIZE = 256 fun forDensity(densityDpi: Float, variant: MapVariant): MapTileProvider { // Choose a size suitable for the given screen density. Adding .3f makes tvdpi (1.3x) // use a higher scale and looks nicer. val scale = Math.round(densityDpi + .3f) .coerceIn(1, 3) // we only support up to 3x the base tile size val tileSize = BASE_TILE_SIZE * scale return MapTileProvider(tileSize, variant) } } override fun getTileUrl(x: Int, y: Int, zoom: Int): URL { return URL(BASE_URL.format(variant.mapTilePrefix, tileSize, zoom, x, y)) } } ================================================ FILE: mobile/src/main/java/com/google/samples/apps/iosched/ui/map/MapUtils.kt ================================================ /* * Copyright 2018 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.ui.map import android.content.Context import android.graphics.Bitmap import androidx.annotation.DrawableRes import androidx.appcompat.content.res.AppCompatResources import androidx.core.graphics.drawable.toBitmap import com.google.android.gms.maps.model.BitmapDescriptorFactory import com.google.maps.android.data.geojson.GeoJsonLayer import com.google.maps.android.data.geojson.GeoJsonPointStyle import com.google.maps.android.ui.IconGenerator import com.google.samples.apps.iosched.R import java.util.Locale /** Process a [GeoJsonLayer] for display on a Map. */ fun processGeoJsonLayer(layer: GeoJsonLayer, context: Context) { val iconGenerator = getLabelIconGenerator(context) layer.features.forEach { feature -> val icon = feature.getProperty("icon") val label = feature.getProperty("label") ?: feature.getProperty("title") val drawableRes = getDrawableResourceForIcon(context, icon) feature.pointStyle = when { drawableRes != 0 -> createIconMarker(context, drawableRes, label) label != null -> createLabelMarker(iconGenerator, label) // Fall back to label else -> GeoJsonPointStyle() // no styling } } } /** Creates a new IconGenerator for labels on the map. */ private fun getLabelIconGenerator(context: Context): IconGenerator { val labelBg = context.getDrawable(R.drawable.map_marker_label_background) return IconGenerator(context).apply { setTextAppearance(context, R.style.TextAppearance_IOSched_Map_MarkerLabel) setBackground(labelBg) } } /** * Returns the drawable resource id for an icon marker, or 0 if no resource with this name exists. */ @DrawableRes fun getDrawableResourceForIcon(context: Context, iconType: String?): Int { if (iconType == null) { return 0 } return context.resources.getIdentifier( iconType.toLowerCase(Locale.US), "drawable", context.packageName ) } /** Creates a GeoJsonPointStyle for a label. */ private fun createLabelMarker( iconGenerator: IconGenerator, title: String ): GeoJsonPointStyle { val icon = BitmapDescriptorFactory.fromBitmap(iconGenerator.makeIcon(title)) return GeoJsonPointStyle().apply { setAnchor(.5f, .5f) setIcon(icon) // Don't set the title because we don't want to show an InfoWindow, but set the snippet for // accessibility services (TalkBack). snippet = title } } /** * Creates a GeoJsonPointStyle for a map icon. The icon is chosen based on the marker type and is * anchored at the bottom center of the marker's location. */ private fun createIconMarker( context: Context, drawableRes: Int, title: String ): GeoJsonPointStyle { val bitmap = drawableToBitmap(context, drawableRes) val icon = BitmapDescriptorFactory.fromBitmap(bitmap) return GeoJsonPointStyle().apply { setAnchor(0.5f, 1f) setTitle(title) setIcon(icon) } } /** Convert a drawable resource to a Bitmap. */ private fun drawableToBitmap(context: Context, @DrawableRes resId: Int): Bitmap { return requireNotNull(AppCompatResources.getDrawable(context, resId)).toBitmap() } ================================================ FILE: mobile/src/main/java/com/google/samples/apps/iosched/ui/map/MapVariant.kt ================================================ /* * Copyright 2019 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.ui.map import androidx.annotation.DrawableRes import androidx.annotation.RawRes import androidx.annotation.StringRes import com.google.samples.apps.iosched.R import com.google.samples.apps.iosched.shared.BuildConfig import org.threeten.bp.Instant import org.threeten.bp.ZonedDateTime /** * A variant of the map UI. Depending on the variant, Map UI may show different markers, tile * overlays, etc. */ enum class MapVariant( val start: Instant, val end: Instant, @StringRes val labelResId: Int, @DrawableRes val iconResId: Int, @RawRes val markersResId: Int, @RawRes val styleResId: Int, val mapTilePrefix: String ) { AFTER_DARK( ZonedDateTime.parse(BuildConfig.CONFERENCE_DAY1_AFTERHOURS_START).toInstant(), ZonedDateTime.parse(BuildConfig.CONFERENCE_DAY1_END).toInstant(), R.string.map_variant_after_dark, R.drawable.ic_map_after_dark, R.raw.map_markers_night, R.raw.map_style_night, "night" ), CONCERT( ZonedDateTime.parse(BuildConfig.CONFERENCE_DAY2_CONCERT_START).toInstant(), ZonedDateTime.parse(BuildConfig.CONFERENCE_DAY2_END).toInstant(), R.string.map_variant_concert, R.drawable.ic_map_concert, R.raw.map_markers_concert, R.raw.map_style_night, "concert" ), // Note: must be last to facilitate [forTime] DAY( ZonedDateTime.parse(BuildConfig.CONFERENCE_DAY1_START).toInstant(), ZonedDateTime.parse(BuildConfig.CONFERENCE_DAY3_END).toInstant(), R.string.map_variant_daytime, R.drawable.ic_map_daytime, R.raw.map_markers_day, R.raw.map_style_day, "day" ); operator fun contains(time: Instant): Boolean { return time in start..end } companion object { /** Returns the first variant containing the specified time, or [DAY] if none is found. */ fun forTime(time: Instant = Instant.now()): MapVariant { return values().find { variant -> time in variant } ?: DAY } } } ================================================ FILE: mobile/src/main/java/com/google/samples/apps/iosched/ui/map/MapVariantAdapter.kt ================================================ /* * Copyright 2019 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.ui.map import android.os.Build import android.view.LayoutInflater import android.view.ViewGroup import android.widget.TextView import androidx.annotation.DrawableRes import androidx.appcompat.content.res.AppCompatResources import androidx.databinding.BindingAdapter import androidx.recyclerview.widget.RecyclerView.Adapter import androidx.recyclerview.widget.RecyclerView.ViewHolder import com.google.samples.apps.iosched.R import com.google.samples.apps.iosched.databinding.ItemMapVariantBinding import com.google.samples.apps.iosched.util.executeAfter internal class MapVariantAdapter( private val callback: (MapVariant) -> Unit ) : Adapter() { var currentSelection: MapVariant? = null set(value) { if (field == value) { return } val previous = field if (previous != null) { notifyItemChanged(items.indexOf(previous)) // deselect previous selection } field = value if (value != null) { notifyItemChanged(items.indexOf(value)) // select new selection } } private val items = MapVariant.values().toMutableList().apply { sortBy { it.start } } override fun getItemCount(): Int = items.size override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MapVariantViewHolder { return MapVariantViewHolder( ItemMapVariantBinding.inflate( LayoutInflater.from(parent.context), parent, false ) ) } override fun onBindViewHolder(holder: MapVariantViewHolder, position: Int) { val mapVariant = items[position] holder.bind(mapVariant, mapVariant == currentSelection, callback) } } internal class MapVariantViewHolder( val binding: ItemMapVariantBinding ) : ViewHolder(binding.root) { fun bind(mapVariant: MapVariant, isSelected: Boolean, callback: (MapVariant) -> Unit) { binding.executeAfter { variant = mapVariant isChecked = isSelected } itemView.setOnClickListener { callback(mapVariant) } } } // This is used instead of drawableStart="@{int_value}" because Databinding interprets the int as a // color instead of a drawable resource ID. @BindingAdapter("variantIcon") fun variantIcon(view: TextView, @DrawableRes iconResId: Int) { val drawable = AppCompatResources.getDrawable(view.context, iconResId) // Below API 23 we need to apply the drawableTint manually. if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.M) { drawable?.setTintList( AppCompatResources.getColorStateList(view.context, R.color.map_variant_icon) ) } view.setCompoundDrawablesRelativeWithIntrinsicBounds(drawable, null, null, null) } ================================================ FILE: mobile/src/main/java/com/google/samples/apps/iosched/ui/map/MapVariantSelectionDialogFragment.kt ================================================ /* * Copyright 2019 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.ui.map import android.annotation.SuppressLint import android.os.Bundle import android.view.Gravity import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.view.ViewGroup.MarginLayoutParams import android.view.WindowManager import androidx.appcompat.app.AppCompatDialogFragment import androidx.core.view.updateLayoutParams import androidx.fragment.app.viewModels import androidx.lifecycle.Lifecycle import androidx.lifecycle.lifecycleScope import androidx.lifecycle.repeatOnLifecycle import androidx.recyclerview.widget.RecyclerView import com.google.samples.apps.iosched.R import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.flow.collect import kotlinx.coroutines.launch @AndroidEntryPoint class MapVariantSelectionDialogFragment : AppCompatDialogFragment() { private val mapViewModel: MapViewModel by viewModels( ownerProducer = { requireParentFragment() } ) private lateinit var adapter: MapVariantAdapter // Normally we would implement onCreateDialog using a MaterialAlertDialogBuilder, but that // doesn't allow the dialog width to wrap its contents, and also doesn't allow positioning // of the dialog. Instead we implement onCreateView and handle the rest later. override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? { return inflater.inflate(R.layout.fragment_map_variant_select, container, false) } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) adapter = MapVariantAdapter(::selectMapVariant) view.findViewById(R.id.map_variant_list).adapter = adapter lifecycleScope.launch { lifecycle.repeatOnLifecycle(Lifecycle.State.STARTED) { mapViewModel.mapVariant.collect { adapter.currentSelection = it } } } } @SuppressLint("RtlHardcoded") override fun onStart() { super.onStart() requireDialog().window?.apply { // Don't dim the screen clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND) // Position the window val isRtl = resources.configuration.layoutDirection == View.LAYOUT_DIRECTION_RTL attributes.gravity = Gravity.BOTTOM or if (isRtl) Gravity.LEFT else Gravity.RIGHT // The window decor view's background shows behind the card, so remove it setBackgroundDrawable(null) } // We can't set margins in XML because when shown as a dialog, onCreateView is passed a null // container. LayoutParams are only generated when the view is added to a Dialog later. val margin = resources.getDimensionPixelSize(R.dimen.margin_normal) view?.updateLayoutParams { setMargins(margin, margin, margin, margin) } } private fun selectMapVariant(mapVariant: MapVariant) { mapViewModel.setMapVariant(mapVariant) dismiss() } } ================================================ FILE: mobile/src/main/java/com/google/samples/apps/iosched/ui/map/MapViewBindingAdapters.kt ================================================ /* * Copyright 2018 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.ui.map import androidx.annotation.DimenRes import androidx.annotation.RawRes import androidx.databinding.BindingAdapter import com.google.android.gms.maps.MapView import com.google.android.gms.maps.model.LatLngBounds import com.google.android.gms.maps.model.MapStyleOptions import com.google.android.gms.maps.model.TileOverlayOptions import com.google.samples.apps.iosched.util.getFloatUsingCompat @BindingAdapter("mapStyle") fun mapStyle(mapView: MapView, @RawRes resId: Int) { if (resId != 0) { mapView.getMapAsync { map -> map.setMapStyle(MapStyleOptions.loadRawResourceStyle(mapView.context, resId)) } } } /** * Sets the map viewport to a specific rectangle specified by two Latitude/Longitude points. */ @BindingAdapter("mapViewport") fun mapViewport(mapView: MapView, bounds: LatLngBounds?) { if (bounds != null) { mapView.getMapAsync { it.setLatLngBoundsForCameraTarget(bounds) } } } /** * Sets the minimum zoom level of the map (how far out the user is allowed to zoom). */ @BindingAdapter("mapMinZoom", "mapMaxZoom", requireAll = true) fun mapZoomLevels(mapView: MapView, @DimenRes minZoomResId: Int, @DimenRes maxZoomResId: Int) { val minZoom = mapView.resources.getFloatUsingCompat(minZoomResId) val maxZoom = mapView.resources.getFloatUsingCompat(maxZoomResId) mapView.getMapAsync { it.setMinZoomPreference(minZoom) it.setMaxZoomPreference(maxZoom) } } @BindingAdapter("isIndoorEnabled") fun isIndoorEnabled(mapView: MapView, isIndoorEnabled: Boolean?) { if (isIndoorEnabled != null) { mapView.getMapAsync { it.isIndoorEnabled = isIndoorEnabled } } } @BindingAdapter("isMapToolbarEnabled") fun isMapToolbarEnabled(mapView: MapView, isMapToolbarEnabled: Boolean?) { if (isMapToolbarEnabled != null) { mapView.getMapAsync { it.uiSettings.isMapToolbarEnabled = isMapToolbarEnabled } } } @BindingAdapter("mapTileProvider") fun mapTileProvider(mapView: MapView, mapVariant: MapVariant?) { mapVariant?.run { val tileProvider = MapTileProvider.forDensity(mapView.resources.displayMetrics.density, mapVariant) mapView.getMapAsync { map -> map.addTileOverlay( TileOverlayOptions() .tileProvider(tileProvider) .visible(true) ) } } } ================================================ FILE: mobile/src/main/java/com/google/samples/apps/iosched/ui/map/MapViewModel.kt ================================================ /* * Copyright 2018 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.ui.map import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.google.android.gms.maps.CameraUpdate import com.google.android.gms.maps.CameraUpdateFactory import com.google.android.gms.maps.GoogleMap import com.google.android.gms.maps.model.LatLngBounds import com.google.maps.android.data.geojson.GeoJsonFeature import com.google.maps.android.data.geojson.GeoJsonLayer import com.google.maps.android.data.geojson.GeoJsonPoint import com.google.samples.apps.iosched.BuildConfig import com.google.samples.apps.iosched.shared.analytics.AnalyticsActions import com.google.samples.apps.iosched.shared.analytics.AnalyticsHelper import com.google.samples.apps.iosched.shared.domain.prefs.MyLocationOptedInUseCase import com.google.samples.apps.iosched.shared.domain.prefs.OptIntoMyLocationUseCase import com.google.samples.apps.iosched.shared.result.successOr import com.google.samples.apps.iosched.shared.result.updateOnSuccess import com.google.samples.apps.iosched.shared.util.tryOffer import com.google.samples.apps.iosched.ui.signin.SignInViewModelDelegate import com.google.samples.apps.iosched.util.WhileViewSubscribed import com.google.samples.apps.iosched.widget.BottomSheetBehavior import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.channels.Channel import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.collect import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.flow.receiveAsFlow import kotlinx.coroutines.flow.stateIn import kotlinx.coroutines.launch import javax.inject.Inject @HiltViewModel class MapViewModel @Inject constructor( private val loadGeoJsonFeaturesUseCase: LoadGeoJsonFeaturesUseCase, private val analyticsHelper: AnalyticsHelper, private val signInViewModelDelegate: SignInViewModelDelegate, private val optIntoMyLocationUseCase: OptIntoMyLocationUseCase, myLocationOptedInUseCase: MyLocationOptedInUseCase ) : ViewModel(), SignInViewModelDelegate by signInViewModelDelegate { /** * Area covered by the venue. Determines the viewport of the map. */ val conferenceLocationBounds = LatLngBounds( BuildConfig.MAP_VIEWPORT_BOUND_SW, BuildConfig.MAP_VIEWPORT_BOUND_NE ) private val _mapVariant = MutableStateFlow(null) val mapVariant: StateFlow = _mapVariant private val _mapCenterEvent = Channel(Channel.CONFLATED) val mapCenterEvent = _mapCenterEvent.receiveAsFlow() private val loadGeoJsonResult = MutableStateFlow(null) val geoJsonLayer: StateFlow = loadGeoJsonResult .onEach { data -> if (data != null) { // TODO: Remove side effects and make these reactive hasLoadedFeatures = true setMapFeatures(data.featureMap) } }.map { data -> data?.geoJsonLayer }.stateIn(viewModelScope, WhileViewSubscribed, null) private val featureLookup: MutableMap = mutableMapOf() private var hasLoadedFeatures = false private var requestedFeatureId: String? = null private val focusZoomLevel = BuildConfig.MAP_CAMERA_FOCUS_ZOOM private var currentZoomLevel = 16 // min zoom level supported private val _bottomSheetStateEvent = Channel(Channel.CONFLATED) val bottomSheetStateEvent = _bottomSheetStateEvent.receiveAsFlow() init { viewModelScope.launch { mapVariant.collect { // When the map variant changes, the selected feature might not be present in the // new variant, so hide the feature detail. it?.let { dismissFeatureDetails() } } } } private val _selectedMarkerInfo = MutableStateFlow(null) val selectedMarkerInfo: StateFlow = _selectedMarkerInfo private val myLocationOptedIn = MutableStateFlow(false) val showMyLocationOption = userInfo.combine(myLocationOptedIn) { info, optedIn -> // Show the button to enable "My Location" when the user is an on-site attendee and he/she // is not opted into the feature yet. info != null && info.isRegistered() && !optedIn } init { viewModelScope.launch { myLocationOptedIn.value = myLocationOptedInUseCase(Unit).successOr(false) } } fun optIntoMyLocation(optIn: Boolean = true) { viewModelScope.launch { optIntoMyLocationUseCase(optIn).updateOnSuccess(myLocationOptedIn) } } fun setMapVariant(variant: MapVariant) { _mapVariant.value = variant } fun onMapDestroyed() { // The geo json layer is tied to the GoogleMap, so we should release it. hasLoadedFeatures = false featureLookup.clear() loadGeoJsonResult.value = null } fun loadMapFeatures(googleMap: GoogleMap) { val variant = _mapVariant.value ?: return // Load markers viewModelScope.launch { loadGeoJsonFeaturesUseCase( LoadGeoJsonParams(googleMap, variant.markersResId) ).updateOnSuccess(loadGeoJsonResult) } } private fun setMapFeatures(features: Map) { featureLookup.clear() featureLookup.putAll(features) updateFeaturesVisibility(currentZoomLevel.toFloat()) // if we have a pending request to highlight a feature, resolve it now val featureId = requestedFeatureId ?: return requestedFeatureId = null highlightFeature(featureId) } fun onZoomChanged(zoom: Float) { // Truncate the zoom and check if we're in the same level val zoomInt = zoom.toInt() if (currentZoomLevel != zoomInt) { currentZoomLevel = zoomInt updateFeaturesVisibility(zoom) } } private fun updateFeaturesVisibility(zoom: Float) { // Don't hide the marker if it's currently being focused on by the user val selectedId = selectedMarkerInfo.value?.id featureLookup.values.forEach { feature -> if (feature.id != selectedId) { val minZoom = feature.getProperty("minZoom")?.toFloatOrNull() ?: 0f feature.pointStyle.isVisible = zoom >= minZoom } } } fun requestHighlightFeature(featureId: String) { if (hasLoadedFeatures) { highlightFeature(featureId) } else { // save and re-evaluate when the map features are loaded requestedFeatureId = featureId } } private fun highlightFeature(featureId: String) { val feature = featureLookup[featureId] ?: return val geometry = feature.geometry as? GeoJsonPoint ?: return // center map on the requested feature. val update = CameraUpdateFactory.newLatLngZoom(geometry.coordinates, focusZoomLevel) _mapCenterEvent.tryOffer(update) // publish feature data val title = feature.getProperty("title") _selectedMarkerInfo.value = MarkerInfo( featureId, title, feature.getProperty("subtitle"), feature.getProperty("description"), feature.getProperty("icon") ) // bring bottom sheet into view _bottomSheetStateEvent.tryOffer(BottomSheetBehavior.STATE_COLLAPSED) // Analytics analyticsHelper.logUiEvent(title, AnalyticsActions.MAP_MARKER_SELECT) } fun dismissFeatureDetails() { _bottomSheetStateEvent.tryOffer(BottomSheetBehavior.STATE_HIDDEN) _selectedMarkerInfo.value = null } fun logViewedMarkerDetails() { val title = _selectedMarkerInfo.value?.title ?: return analyticsHelper.logUiEvent(title, AnalyticsActions.MAP_MARKER_DETAILS) } } data class MarkerInfo( val id: String, val title: String, val subtitle: String?, val description: String?, val iconName: String? ) ================================================ FILE: mobile/src/main/java/com/google/samples/apps/iosched/ui/messages/SnackbarMessage.kt ================================================ /* * Copyright 2018 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.ui.messages import com.google.samples.apps.iosched.model.Session data class SnackbarMessage( /** Resource string ID of the message to show */ val messageId: Int, /** Optional resource string ID for the action (example: "Got it!") */ val actionId: Int? = null, /** Set to true for a Snackbar with long duration */ val longDuration: Boolean = false, /** Optional change ID to avoid repetition of messages */ val requestChangeId: String? = null, /** Optional session */ val session: Session? = null ) { override fun toString(): String { return "Session: ${session?.id}, ${session?.title?.take(30)}. Change: $requestChangeId " } } ================================================ FILE: mobile/src/main/java/com/google/samples/apps/iosched/ui/messages/SnackbarMessageFragmentExtensions.kt ================================================ /* * Copyright 2018 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.ui.messages import androidx.core.text.HtmlCompat import androidx.core.text.HtmlCompat.FROM_HTML_MODE_LEGACY import androidx.fragment.app.Fragment import com.google.samples.apps.iosched.util.launchAndRepeatWithViewLifecycle import com.google.samples.apps.iosched.widget.FadingSnackbar import kotlinx.coroutines.flow.collect /** * An extension for Fragments that sets up a Snackbar with a [SnackbarMessageManager]. */ fun Fragment.setupSnackbarManager( snackbarMessageManager: SnackbarMessageManager, fadingSnackbar: FadingSnackbar ) { launchAndRepeatWithViewLifecycle { snackbarMessageManager.currentSnackbar.collect { message -> if (message == null) { return@collect } val messageText = HtmlCompat.fromHtml( requireContext().getString(message.messageId, message.session?.title), FROM_HTML_MODE_LEGACY ) fadingSnackbar.show( messageText = messageText, actionId = message.actionId, longDuration = message.longDuration, actionClick = { snackbarMessageManager.processDismissedMessage(message) fadingSnackbar.dismiss() }, // When the snackbar is dismissed, ping the snackbar message manager in case there // are pending messages. dismissListener = { snackbarMessageManager.removeMessageAndLoadNext(message) } ) } } } ================================================ FILE: mobile/src/main/java/com/google/samples/apps/iosched/ui/messages/SnackbarMessageManager.kt ================================================ /* * Copyright 2018 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.ui.messages import androidx.annotation.VisibleForTesting import com.google.samples.apps.iosched.R import com.google.samples.apps.iosched.shared.data.prefs.PreferenceStorage import com.google.samples.apps.iosched.shared.di.ApplicationScope import com.google.samples.apps.iosched.shared.domain.prefs.StopSnackbarActionUseCase import com.google.samples.apps.iosched.ui.messages.SnackbarMessageManager.Companion.MAX_ITEMS import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.launch import timber.log.Timber import javax.inject.Inject import javax.inject.Singleton /** * A single source of Snackbar messages related to reservations. * * Only shows one Snackbar related to one change across all screens * * Emits new values on request (when a Snackbar is dismissed and ready to show a new message) * * It keeps a list of [MAX_ITEMS] items, enough to figure out if a message has already been shown, * but limited to avoid wasting resources. * */ @Singleton open class SnackbarMessageManager @Inject constructor( private val preferenceStorage: PreferenceStorage, @ApplicationScope private val coroutineScope: CoroutineScope, private val stopSnackbarActionUseCase: StopSnackbarActionUseCase ) { companion object { // Keep a fixed number of old items @VisibleForTesting const val MAX_ITEMS = 10 } private val messages = mutableListOf() private val _currentSnackbar = MutableStateFlow(null) val currentSnackbar: StateFlow = _currentSnackbar fun addMessage(msg: SnackbarMessage) { coroutineScope.launch { if (!shouldSnackbarBeIgnored(msg)) { // Limit amount of pending messages if (messages.size > MAX_ITEMS) { Timber.e("Too many Snackbar messages. Message id: ${msg.messageId}") return@launch } // If the new message is about the same change as a pending one, keep the old one. (rare) val sameRequestId = messages.find { it.requestChangeId == msg.requestChangeId } if (sameRequestId == null) { messages.add(msg) } loadNext() } } } private fun loadNext() { if (_currentSnackbar.value == null) { _currentSnackbar.value = messages.firstOrNull() } } fun removeMessageAndLoadNext(shownMsg: SnackbarMessage?) { messages.removeAll { it == shownMsg } if (_currentSnackbar.value == shownMsg) { _currentSnackbar.value = null } loadNext() } fun processDismissedMessage(message: SnackbarMessage) { if (message.actionId == R.string.dont_show) { coroutineScope.launch { stopSnackbarActionUseCase(true) } } } private suspend fun shouldSnackbarBeIgnored(msg: SnackbarMessage): Boolean { return preferenceStorage.isSnackbarStopped() && msg.actionId == R.string.dont_show } } ================================================ FILE: mobile/src/main/java/com/google/samples/apps/iosched/ui/onboarding/OnboardingActivity.kt ================================================ /* * Copyright 2018 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.ui.onboarding import android.os.Bundle import android.widget.FrameLayout import androidx.activity.viewModels import androidx.appcompat.app.AppCompatActivity import androidx.core.view.WindowCompat import androidx.core.view.WindowInsetsCompat import androidx.core.view.updatePadding import androidx.lifecycle.Lifecycle import androidx.lifecycle.lifecycleScope import androidx.lifecycle.repeatOnLifecycle import com.google.samples.apps.iosched.R import com.google.samples.apps.iosched.shared.util.inTransaction import com.google.samples.apps.iosched.ui.signin.SignInDialogFragment import com.google.samples.apps.iosched.util.doOnApplyWindowInsets import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.flow.collect import kotlinx.coroutines.launch @AndroidEntryPoint class OnboardingActivity : AppCompatActivity() { private val viewModel: OnboardingViewModel by viewModels() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_onboarding) WindowCompat.setDecorFitsSystemWindows(window, false) val container: FrameLayout = findViewById(R.id.fragment_container) container.doOnApplyWindowInsets { v, insets, padding -> val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars()) v.updatePadding(top = padding.top + systemBars.top) } if (savedInstanceState == null) { supportFragmentManager.inTransaction { add(R.id.fragment_container, OnboardingFragment()) } } lifecycleScope.launch { lifecycle.repeatOnLifecycle(Lifecycle.State.STARTED) { viewModel.navigationActions.collect { action -> if (action == OnboardingNavigationAction.NavigateToSignInDialog) { openSignInDialog() } } } } } private fun openSignInDialog() { SignInDialogFragment().show(supportFragmentManager, DIALOG_SIGN_IN) } companion object { private const val DIALOG_SIGN_IN = "dialog_sign_in" } } ================================================ FILE: mobile/src/main/java/com/google/samples/apps/iosched/ui/onboarding/OnboardingFragment.kt ================================================ /* * Copyright 2018 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.ui.onboarding import android.annotation.SuppressLint import android.content.Context import android.content.Intent import android.os.Bundle import android.os.Handler import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.fragment.app.Fragment import androidx.fragment.app.FragmentManager import androidx.fragment.app.FragmentPagerAdapter import androidx.fragment.app.viewModels import com.google.samples.apps.iosched.databinding.FragmentOnboardingBinding import com.google.samples.apps.iosched.shared.util.TimeUtils import com.google.samples.apps.iosched.ui.MainActivity import com.google.samples.apps.iosched.util.launchAndRepeatWithViewLifecycle import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.flow.collect private const val AUTO_ADVANCE_DELAY = 6_000L private const val INITIAL_ADVANCE_DELAY = 3_000L /** * Contains the pages of the onboarding experience and responds to [OnboardingViewModel] events. */ @AndroidEntryPoint class OnboardingFragment : Fragment() { private val onboardingViewModel: OnboardingViewModel by viewModels() private lateinit var binding: FragmentOnboardingBinding private lateinit var pagerPager: ViewPagerPager private val handler = Handler() // Auto-advance the view pager to give overview of app benefits private val advancePager: Runnable = object : Runnable { override fun run() { pagerPager.advance() handler.postDelayed(this, AUTO_ADVANCE_DELAY) } } @SuppressLint("ClickableViewAccessibility") override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View { binding = FragmentOnboardingBinding.inflate(inflater, container, false).apply { viewModel = onboardingViewModel lifecycleOwner = viewLifecycleOwner pager.adapter = OnboardingAdapter(childFragmentManager) pagerPager = ViewPagerPager(pager) // If user touches pager then stop auto advance pager.setOnTouchListener { _, _ -> handler.removeCallbacks(advancePager) false } } return binding.root } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) launchAndRepeatWithViewLifecycle { onboardingViewModel.navigationActions.collect { action -> if (action == OnboardingNavigationAction.NavigateToMainScreen) { requireActivity().run { startActivity(Intent(this, MainActivity::class.java)) finish() } } } } } override fun onAttach(context: Context) { super.onAttach(context) handler.postDelayed(advancePager, INITIAL_ADVANCE_DELAY) } override fun onDetach() { handler.removeCallbacks(advancePager) super.onDetach() } } class OnboardingAdapter(fragmentManager: FragmentManager) : FragmentPagerAdapter(fragmentManager) { // Don't show then countdown fragment if the conference has already started private val fragments = if (!TimeUtils.conferenceHasStarted()) { // Before the conference arrayOf( WelcomePreConferenceFragment(), OnboardingSignInFragment() ) } else if (TimeUtils.conferenceHasStarted() && !TimeUtils.conferenceHasEnded()) { // During the conference arrayOf( WelcomeDuringConferenceFragment(), OnboardingSignInFragment() ) } else { // Post the conference arrayOf( WelcomePostConferenceFragment() ) } override fun getItem(position: Int) = fragments[position] override fun getCount() = fragments.size } ================================================ FILE: mobile/src/main/java/com/google/samples/apps/iosched/ui/onboarding/OnboardingSignInFragment.kt ================================================ /* * Copyright 2019 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.ui.onboarding import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.fragment.app.Fragment import androidx.fragment.app.activityViewModels import com.google.samples.apps.iosched.databinding.FragmentOnboardingSigninBinding import dagger.hilt.android.AndroidEntryPoint @AndroidEntryPoint class OnboardingSignInFragment : Fragment() { private lateinit var binding: FragmentOnboardingSigninBinding private val onboardingViewModel: OnboardingViewModel by activityViewModels() override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View { binding = FragmentOnboardingSigninBinding.inflate(inflater, container, false).apply { lifecycleOwner = viewLifecycleOwner } return binding.root } override fun onActivityCreated(savedInstanceState: Bundle?) { super.onActivityCreated(savedInstanceState) binding.activityViewModel = onboardingViewModel } } ================================================ FILE: mobile/src/main/java/com/google/samples/apps/iosched/ui/onboarding/OnboardingViewModel.kt ================================================ /* * Copyright 2018 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.ui.onboarding import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.google.samples.apps.iosched.shared.domain.prefs.OnboardingCompleteActionUseCase import com.google.samples.apps.iosched.shared.util.tryOffer import com.google.samples.apps.iosched.ui.signin.SignInViewModelDelegate import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.channels.Channel import kotlinx.coroutines.flow.receiveAsFlow import kotlinx.coroutines.launch import javax.inject.Inject /** * Records that onboarding has been completed and navigates user onward. */ @HiltViewModel class OnboardingViewModel @Inject constructor( private val onboardingCompleteActionUseCase: OnboardingCompleteActionUseCase, signInViewModelDelegate: SignInViewModelDelegate ) : ViewModel(), SignInViewModelDelegate by signInViewModelDelegate { private val _navigationActions = Channel(Channel.CONFLATED) // OnboardingViewModel is a shared ViewModel. Therefore, the navigation actions could be // received by multiple collectors at the same time. With `receiveAsFlow`, we make sure only // one collector will process the navigation event to avoid multiple back stack entries. val navigationActions = _navigationActions.receiveAsFlow() fun getStartedClick() { viewModelScope.launch { onboardingCompleteActionUseCase(true) _navigationActions.send(OnboardingNavigationAction.NavigateToMainScreen) } } fun onSigninClicked() { _navigationActions.tryOffer(OnboardingNavigationAction.NavigateToSignInDialog) } } sealed class OnboardingNavigationAction { object NavigateToMainScreen : OnboardingNavigationAction() object NavigateToSignInDialog : OnboardingNavigationAction() } ================================================ FILE: mobile/src/main/java/com/google/samples/apps/iosched/ui/onboarding/ViewPagerPager.kt ================================================ /* * Copyright 2018 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.ui.onboarding import android.animation.ValueAnimator import android.view.animation.AnimationUtils import androidx.core.animation.addListener import androidx.viewpager.widget.ViewPager /** * Helper class for automatically scrolling pages of a [ViewPager] which does not allow you to * customize the speed at which it changes page when directly setting the current page. */ class ViewPagerPager(private val viewPager: ViewPager) { private val fastOutSlowIn = AnimationUtils.loadInterpolator(viewPager.context, android.R.interpolator.fast_out_slow_in) fun advance() { if (viewPager.width <= 0) return val current = viewPager.currentItem val next = ((current + 1) % requireNotNull(viewPager.adapter).count) val pages = next - current val dragDistance = pages * viewPager.width ValueAnimator.ofInt(0, dragDistance).apply { var dragProgress = 0 var draggedPages = 0 addListener( onStart = { viewPager.beginFakeDrag() }, onEnd = { viewPager.endFakeDrag() } ) addUpdateListener { if (!viewPager.isFakeDragging) { // Sometimes onAnimationUpdate is called with initial value before // onAnimationStart is called. return@addUpdateListener } val dragPoint = (animatedValue as Int) val dragBy = dragPoint - dragProgress viewPager.fakeDragBy(-dragBy.toFloat()) dragProgress = dragPoint // Fake dragging doesn't let you drag more than one page width. If we want to do // this then need to end and start a new fake drag. val draggedPagesProgress = dragProgress / viewPager.width if (draggedPagesProgress != draggedPages) { viewPager.endFakeDrag() viewPager.beginFakeDrag() draggedPages = draggedPagesProgress } } duration = if (pages == 1) PAGE_CHANGE_DURATION else MULTI_PAGE_CHANGE_DURATION interpolator = fastOutSlowIn }.start() } companion object { private const val PAGE_CHANGE_DURATION = 400L private const val MULTI_PAGE_CHANGE_DURATION = 600L } } ================================================ FILE: mobile/src/main/java/com/google/samples/apps/iosched/ui/onboarding/WelcomeDuringConferenceFragment.kt ================================================ /* * Copyright 2019 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.ui.onboarding import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.core.view.doOnLayout import androidx.fragment.app.Fragment import androidx.fragment.app.activityViewModels import com.google.samples.apps.iosched.databinding.FragmentOnboardingWelcomeDuringBinding import dagger.hilt.android.AndroidEntryPoint /** * First page of onboarding showing a welcome message during the conference. */ @AndroidEntryPoint class WelcomeDuringConferenceFragment : Fragment() { private lateinit var binding: FragmentOnboardingWelcomeDuringBinding private val viewModel: OnboardingViewModel by activityViewModels() override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View { binding = FragmentOnboardingWelcomeDuringBinding.inflate(inflater, container, false).apply { lifecycleOwner = viewLifecycleOwner } return binding.root } override fun onActivityCreated(savedInstanceState: Bundle?) { super.onActivityCreated(savedInstanceState) binding.activityViewModel = viewModel binding.buttonSignin.doOnLayout { activity?.reportFullyDrawn() } } } ================================================ FILE: mobile/src/main/java/com/google/samples/apps/iosched/ui/onboarding/WelcomePostConferenceFragment.kt ================================================ /* * Copyright 2019 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.ui.onboarding import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.core.view.doOnLayout import androidx.fragment.app.Fragment import com.google.samples.apps.iosched.R /** * First page of onboarding showing a welcome message post the conference. */ class WelcomePostConferenceFragment : Fragment() { override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? { return inflater.inflate(R.layout.fragment_onboarding_welcome_post, container, false) } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { view.doOnLayout { activity?.reportFullyDrawn() } } } ================================================ FILE: mobile/src/main/java/com/google/samples/apps/iosched/ui/onboarding/WelcomePreConferenceFragment.kt ================================================ /* * Copyright 2019 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.ui.onboarding import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.core.view.doOnLayout import androidx.fragment.app.Fragment import androidx.fragment.app.activityViewModels import com.google.samples.apps.iosched.databinding.FragmentOnboardingWelcomePreBinding import dagger.hilt.android.AndroidEntryPoint /** * First page of onboarding showing a welcome message before the conference. */ @AndroidEntryPoint class WelcomePreConferenceFragment : Fragment() { private lateinit var binding: FragmentOnboardingWelcomePreBinding private val viewModel: OnboardingViewModel by activityViewModels() override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View { binding = FragmentOnboardingWelcomePreBinding.inflate(inflater, container, false).apply { lifecycleOwner = viewLifecycleOwner } return binding.root } override fun onActivityCreated(savedInstanceState: Bundle?) { super.onActivityCreated(savedInstanceState) binding.activityViewModel = viewModel binding.buttonSignin.doOnLayout { activity?.reportFullyDrawn() } } } ================================================ FILE: mobile/src/main/java/com/google/samples/apps/iosched/ui/reservation/RemoveReservationDialogFragment.kt ================================================ /* * Copyright 2018 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.ui.reservation import android.app.Dialog import android.content.res.Resources import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.Toast import androidx.appcompat.app.AppCompatDialogFragment import androidx.fragment.app.viewModels import androidx.lifecycle.Lifecycle import androidx.lifecycle.lifecycleScope import androidx.lifecycle.repeatOnLifecycle import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.samples.apps.iosched.R import com.google.samples.apps.iosched.model.SessionId import com.google.samples.apps.iosched.util.makeBold import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.flow.collect import kotlinx.coroutines.launch /** * Dialog that confirms the user really wants to cancel their reservation */ @AndroidEntryPoint class RemoveReservationDialogFragment : AppCompatDialogFragment() { companion object { const val DIALOG_REMOVE_RESERVATION = "dialog_remove_reservation" private const val USER_ID_KEY = "user_id" private const val SESSION_ID_KEY = "session_id" private const val SESSION_TITLE_KEY = "session_title" fun newInstance( parameters: RemoveReservationDialogParameters ): RemoveReservationDialogFragment { val bundle = Bundle().apply { putString(USER_ID_KEY, parameters.userId) putString(SESSION_ID_KEY, parameters.sessionId) putString(SESSION_TITLE_KEY, parameters.sessionTitle) } return RemoveReservationDialogFragment().apply { arguments = bundle } } } private val viewModel: RemoveReservationViewModel by viewModels() override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { val context = requireContext() val args = requireNotNull(arguments) val sessionTitle = requireNotNull(args.getString(SESSION_TITLE_KEY)) return MaterialAlertDialogBuilder(context) .setTitle(R.string.remove_reservation_title) .setMessage(formatRemoveReservationMessage(context.resources, sessionTitle)) .setNegativeButton(R.string.cancel, null) .setPositiveButton(R.string.remove) { _, _ -> viewModel.removeReservation() } .create() } override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? { val sessionId = arguments?.getString(SESSION_ID_KEY) if (sessionId == null) { dismiss() } return super.onCreateView(inflater, container, savedInstanceState) } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) lifecycleScope.launch { lifecycle.repeatOnLifecycle(Lifecycle.State.STARTED) { viewModel.snackbarMessages.collect { // Using Toast instead of Snackbar as it's easier for DialogFragment Toast.makeText( requireContext(), it.messageId, if (it.longDuration) Toast.LENGTH_LONG else Toast.LENGTH_SHORT ).show() } } } } private fun formatRemoveReservationMessage( res: Resources, sessionTitle: String ): CharSequence { val text = res.getString(R.string.remove_reservation_content, sessionTitle) return text.makeBold(sessionTitle) } } data class RemoveReservationDialogParameters( val userId: String, val sessionId: SessionId, val sessionTitle: String ) ================================================ FILE: mobile/src/main/java/com/google/samples/apps/iosched/ui/reservation/RemoveReservationViewModel.kt ================================================ /* * Copyright 2019 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.ui.reservation import androidx.lifecycle.SavedStateHandle import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.google.samples.apps.iosched.R import com.google.samples.apps.iosched.model.SessionId import com.google.samples.apps.iosched.model.userdata.UserSession import com.google.samples.apps.iosched.shared.domain.sessions.LoadUserSessionUseCase import com.google.samples.apps.iosched.shared.domain.users.ReservationActionUseCase import com.google.samples.apps.iosched.shared.domain.users.ReservationRequestAction import com.google.samples.apps.iosched.shared.domain.users.ReservationRequestParameters import com.google.samples.apps.iosched.shared.result.Result.Error import com.google.samples.apps.iosched.shared.result.data import com.google.samples.apps.iosched.ui.messages.SnackbarMessage import com.google.samples.apps.iosched.ui.signin.SignInViewModelDelegate import com.google.samples.apps.iosched.util.WhileViewSubscribed import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.channels.BufferOverflow import kotlinx.coroutines.channels.Channel import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.collect import kotlinx.coroutines.flow.receiveAsFlow import kotlinx.coroutines.flow.shareIn import kotlinx.coroutines.flow.stateIn import kotlinx.coroutines.flow.transform import kotlinx.coroutines.launch import javax.inject.Inject @HiltViewModel class RemoveReservationViewModel @Inject constructor( savedStateHandle: SavedStateHandle, signInViewModelDelegate: SignInViewModelDelegate, private val loadUserSessionUseCase: LoadUserSessionUseCase, private val reservationActionUseCase: ReservationActionUseCase ) : ViewModel(), SignInViewModelDelegate by signInViewModelDelegate { private val sessionId: SessionId? = savedStateHandle.get("session_id") private val userIdStateFlow: StateFlow = userId.stateIn(viewModelScope, WhileViewSubscribed, null) val userSession: StateFlow = userIdStateFlow.transform { userId -> if (userId != null && sessionId != null) { loadUserSessionUseCase(userId to sessionId).collect { loadResult -> emit(loadResult.data?.userSession) } } }.stateIn(viewModelScope, WhileViewSubscribed, null) private val _snackbarMessages = Channel(3, BufferOverflow.DROP_LATEST) val snackbarMessages: Flow = _snackbarMessages.receiveAsFlow().shareIn(viewModelScope, WhileViewSubscribed) fun removeReservation() { if (sessionId == null) return val userId = userIdStateFlow.value ?: return val userSession = userSession.value viewModelScope.launch { val result = reservationActionUseCase( ReservationRequestParameters( userId, sessionId, ReservationRequestAction.CancelAction(), userSession ) ) if (result is Error) { _snackbarMessages.send( SnackbarMessage( messageId = R.string.reservation_error, longDuration = true ) ) } } } } ================================================ FILE: mobile/src/main/java/com/google/samples/apps/iosched/ui/reservation/ReservationTextView.kt ================================================ /* * Copyright 2018 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.ui.reservation import android.content.Context import android.util.AttributeSet import androidx.appcompat.widget.AppCompatTextView import com.google.samples.apps.iosched.R /** * An [AppCompatTextView] extension supporting multiple custom states, representing the status * of a user's reservation for an event. */ class ReservationTextView @JvmOverloads constructor( context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = android.R.attr.textViewStyle ) : AppCompatTextView(context, attrs, defStyleAttr) { var status = ReservationViewState.RESERVABLE set(value) { if (value == field) return field = value setText(value.text) refreshDrawableState() } init { setText(ReservationViewState.RESERVABLE.text) val drawable = context.getDrawable(R.drawable.asld_reservation) setCompoundDrawablesRelativeWithIntrinsicBounds(drawable, null, null, null) } override fun onCreateDrawableState(extraSpace: Int): IntArray { @Suppress("SENSELESS_COMPARISON") // Status is null during super init if (status == null) return super.onCreateDrawableState(extraSpace) val drawableState = super.onCreateDrawableState(extraSpace + 1) mergeDrawableStates(drawableState, status.state) return drawableState } } ================================================ FILE: mobile/src/main/java/com/google/samples/apps/iosched/ui/reservation/ReservationViewState.kt ================================================ /* * Copyright 2018 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.ui.reservation import androidx.annotation.StringRes import com.google.samples.apps.iosched.R import com.google.samples.apps.iosched.model.userdata.UserEvent /** * Models the different states of a reservation and a corresponding content description. */ enum class ReservationViewState( val state: IntArray, @StringRes val text: Int, @StringRes val contentDescription: Int ) { RESERVABLE( intArrayOf(R.attr.state_reservable), R.string.reservation_reservable, R.string.a11y_reservation_available ), WAIT_LIST_AVAILABLE( intArrayOf(R.attr.state_wait_list_available), R.string.reservation_waitlist_available, R.string.a11y_reservation_wait_list_available ), WAIT_LISTED( intArrayOf(R.attr.state_wait_listed), R.string.reservation_waitlisted, R.string.a11y_reservation_wait_listed ), RESERVED( intArrayOf(R.attr.state_reserved), R.string.reservation_reserved, R.string.a11y_reservation_reserved ), RESERVATION_PENDING( intArrayOf(R.attr.state_reservation_pending), R.string.reservation_pending, R.string.a11y_reservation_pending ), RESERVATION_DISABLED( intArrayOf(R.attr.state_reservation_disabled), R.string.reservation_disabled, R.string.a11y_reservation_disabled ); companion object { fun fromUserEvent(userEvent: UserEvent?, deniedByCutoff: Boolean): ReservationViewState { return when { // Order is significant, e.g. a pending cancellation is also reserved. userEvent?.isReservationPending() == true || userEvent?.isCancelPending() == true -> { // Treat both pending reservations & cancellations the same. This is important // as the icon animations all expect to do through the same pending state. RESERVATION_PENDING } userEvent?.isReserved() == true -> RESERVED userEvent?.isWaitlisted() == true -> WAIT_LISTED // TODO ?? -> WAIT_LIST_AVAILABLE deniedByCutoff -> RESERVATION_DISABLED else -> RESERVABLE } } } } ================================================ FILE: mobile/src/main/java/com/google/samples/apps/iosched/ui/reservation/ReserveButton.kt ================================================ /* * Copyright 2018 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.ui.reservation import android.content.Context import android.util.AttributeSet import androidx.appcompat.widget.AppCompatImageButton import com.google.samples.apps.iosched.R /** * An [AppCompatImageButton] extension supporting multiple custom states, representing the status * of a user's reservation for an event. */ class ReserveButton(context: Context, attrs: AttributeSet) : AppCompatImageButton(context, attrs) { var status = ReservationViewState.RESERVATION_DISABLED set(value) { if (value == field) return field = value contentDescription = context.getString(value.contentDescription) refreshDrawableState() } init { // Drawable defining drawables for each reservation state setImageResource(R.drawable.ic_reservation) status = ReservationViewState.RESERVABLE } override fun onCreateDrawableState(extraSpace: Int): IntArray { @Suppress("SENSELESS_COMPARISON") // Status is null during super init if (status == null) return super.onCreateDrawableState(extraSpace) val drawableState = super.onCreateDrawableState(extraSpace + 1) mergeDrawableStates(drawableState, status.state) return drawableState } } ================================================ FILE: mobile/src/main/java/com/google/samples/apps/iosched/ui/reservation/StarReserveFab.kt ================================================ /* * Copyright 2018 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.ui.reservation import android.content.Context import android.util.AttributeSet import android.widget.Checkable import androidx.annotation.DrawableRes import com.google.android.material.floatingactionbutton.FloatingActionButton import com.google.samples.apps.iosched.R import com.google.samples.apps.iosched.ui.reservation.StarReserveFabMode.RESERVE import com.google.samples.apps.iosched.ui.reservation.StarReserveFabMode.STAR /** * An extension to the [FloatingActionButton] supporting multiple custom states, representing the * status of a user's reservation for an event or whether an event is bookmarked (as modelled by * the checked state). */ class StarReserveFab( context: Context, attrs: AttributeSet ) : FloatingActionButton(context, attrs), Checkable { private var mode = RESERVE private var _checked = false set(value) { if (field != value || mode != STAR) { field = value currentDrawable = R.drawable.asld_star_event mode = STAR val contentDescRes = if (value) R.string.a11y_starred else R.string.a11y_unstarred contentDescription = context.getString(contentDescRes) refreshDrawableState() } } var reservationStatus: ReservationViewState? = null set(value) { if (value != field || mode != RESERVE) { field = value currentDrawable = R.drawable.asld_reservation mode = RESERVE if (value != null) { contentDescription = context.getString(value.contentDescription) } refreshDrawableState() } } @DrawableRes private var currentDrawable = 0 set(value) { if (field != value) { field = value setImageResource(value) } } override fun isChecked() = _checked override fun setChecked(checked: Boolean) { _checked = checked } override fun toggle() { _checked = !_checked } override fun onCreateDrawableState(extraSpace: Int): IntArray { if (!isShowingStar() && !isShowingReservation()) { return super.onCreateDrawableState(extraSpace) } val drawableState = super.onCreateDrawableState(extraSpace + 1) when { isShowingStar() -> { val state = if (_checked) stateChecked else stateUnchecked mergeDrawableStates(drawableState, state) } isShowingReservation() -> { mergeDrawableStates(drawableState, reservationStatus?.state) } } return drawableState } private fun isShowingReservation() = currentDrawable == R.drawable.asld_reservation private fun isShowingStar() = currentDrawable == R.drawable.asld_star_event companion object { private val stateChecked = intArrayOf(android.R.attr.state_checked) private val stateUnchecked = intArrayOf(-android.R.attr.state_checked) } } /** * Enum of the mutually exclusive modes [StarReserveFab] can be in. */ private enum class StarReserveFabMode { STAR, RESERVE } ================================================ FILE: mobile/src/main/java/com/google/samples/apps/iosched/ui/reservation/SwapReservationDialogFragment.kt ================================================ /* * Copyright 2018 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.ui.reservation import android.app.Dialog import android.content.res.Resources import android.os.Bundle import androidx.appcompat.app.AppCompatDialogFragment import androidx.lifecycle.coroutineScope import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.samples.apps.iosched.R import com.google.samples.apps.iosched.shared.domain.users.SwapActionUseCase import com.google.samples.apps.iosched.shared.domain.users.SwapRequestParameters import com.google.samples.apps.iosched.util.makeBold import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.launch import javax.inject.Inject /** * Dialog that confirms the user wants to replace their reservations */ @AndroidEntryPoint class SwapReservationDialogFragment : AppCompatDialogFragment() { companion object { const val DIALOG_SWAP_RESERVATION = "dialog_swap_reservation" private const val USER_ID_KEY = "user_id" private const val FROM_ID_KEY = "from_id" private const val FROM_TITLE_KEY = "from_title" private const val TO_ID_KEY = "to_id" private const val TO_TITLE_KEY = "to_title" fun newInstance(parameters: SwapRequestParameters): SwapReservationDialogFragment { val bundle = Bundle().apply { putString(USER_ID_KEY, parameters.userId) putString(FROM_ID_KEY, parameters.fromId) putString(FROM_TITLE_KEY, parameters.fromTitle) putString(TO_ID_KEY, parameters.toId) putString(TO_TITLE_KEY, parameters.toTitle) } return SwapReservationDialogFragment().apply { arguments = bundle } } } @Inject lateinit var swapActionUseCase: SwapActionUseCase override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { val context = requireContext() val args = requireNotNull(arguments) val userId = requireNotNull(args.getString(USER_ID_KEY)) val fromId = requireNotNull(args.getString(FROM_ID_KEY)) val fromTitle = requireNotNull(args.getString(FROM_TITLE_KEY)) val toId = requireNotNull(args.getString(TO_ID_KEY)) val toTitle = requireNotNull(args.getString(TO_TITLE_KEY)) return MaterialAlertDialogBuilder(context) .setTitle(R.string.swap_reservation_title) .setMessage(formatSwapReservationMessage(context.resources, fromTitle, toTitle)) .setNegativeButton(R.string.cancel, null) .setPositiveButton(R.string.swap) { _, _ -> viewLifecycleOwner.lifecycle.coroutineScope.launch { swapActionUseCase( SwapRequestParameters(userId, fromId, fromTitle, toId, toTitle) ) } } .create() } private fun formatSwapReservationMessage( res: Resources, fromTitle: String, toTitle: String ): CharSequence { val text = res.getString(R.string.swap_reservation_content, fromTitle, toTitle) return text.makeBold(fromTitle).makeBold(toTitle) } } ================================================ FILE: mobile/src/main/java/com/google/samples/apps/iosched/ui/schedule/DayIndicator.kt ================================================ /* * Copyright 2019 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.ui.schedule import com.google.samples.apps.iosched.model.ConferenceDay /** An indicator for days on the Schedule. */ class DayIndicator( val day: ConferenceDay, val checked: Boolean = false, val enabled: Boolean = true ) { // Only the day is used for equality override fun equals(other: Any?): Boolean = this === other || (other is DayIndicator && day == other.day) // Only the day is used for equality override fun hashCode(): Int = day.hashCode() fun areUiContentsTheSame(other: DayIndicator): Boolean { return checked == other.checked && enabled == other.enabled } } ================================================ FILE: mobile/src/main/java/com/google/samples/apps/iosched/ui/schedule/DayIndicatorAdapter.kt ================================================ /* * Copyright 2019 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.ui.schedule import android.view.LayoutInflater import android.view.ViewGroup import android.widget.TextView import androidx.databinding.BindingAdapter import androidx.lifecycle.LifecycleOwner import androidx.recyclerview.widget.DiffUtil.ItemCallback import androidx.recyclerview.widget.ListAdapter import androidx.recyclerview.widget.RecyclerView.ViewHolder import com.google.samples.apps.iosched.databinding.ItemScheduleDayIndicatorBinding import com.google.samples.apps.iosched.shared.util.TimeUtils import com.google.samples.apps.iosched.util.executeAfter class DayIndicatorAdapter( private val scheduleViewModel: ScheduleViewModel, private val lifecycleOwner: LifecycleOwner ) : ListAdapter(IndicatorDiff) { init { setHasStableIds(true) } override fun getItemId(position: Int): Long { return getItem(position).day.start.toEpochSecond() } override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): DayIndicatorViewHolder { val binding = ItemScheduleDayIndicatorBinding .inflate(LayoutInflater.from(parent.context), parent, false) return DayIndicatorViewHolder(binding, scheduleViewModel, lifecycleOwner) } override fun onBindViewHolder(holder: DayIndicatorViewHolder, position: Int) { holder.bind(getItem(position)) } } class DayIndicatorViewHolder( private val binding: ItemScheduleDayIndicatorBinding, private val scheduleViewModel: ScheduleViewModel, private val lifecycleOwner: LifecycleOwner ) : ViewHolder(binding.root) { fun bind(item: DayIndicator) { binding.executeAfter { indicator = item viewModel = scheduleViewModel lifecycleOwner = this@DayIndicatorViewHolder.lifecycleOwner } } } object IndicatorDiff : ItemCallback() { override fun areItemsTheSame(oldItem: DayIndicator, newItem: DayIndicator) = oldItem == newItem override fun areContentsTheSame(oldItem: DayIndicator, newItem: DayIndicator) = oldItem.areUiContentsTheSame(newItem) } @BindingAdapter("indicatorText", "inConferenceTimeZone", requireAll = true) fun setIndicatorText( view: TextView, dayIndicator: DayIndicator, inConferenceTimeZone: Boolean ) { view.setText(TimeUtils.getShortLabelResForDay(dayIndicator.day, inConferenceTimeZone)) } ================================================ FILE: mobile/src/main/java/com/google/samples/apps/iosched/ui/schedule/DaySeparatorItemDecoration.kt ================================================ /* * Copyright 2019 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.ui.schedule import android.content.Context import android.graphics.Canvas import android.graphics.Color import android.graphics.Paint import android.graphics.Rect import android.text.Layout.Alignment.ALIGN_CENTER import android.text.StaticLayout import android.text.TextPaint import android.util.SparseArray import android.view.View import androidx.core.content.res.ResourcesCompat import androidx.core.content.res.getDimensionPixelSizeOrThrow import androidx.core.content.res.getResourceIdOrThrow import androidx.core.graphics.withTranslation import androidx.core.util.containsKey import androidx.core.view.forEach import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView.ItemDecoration import androidx.recyclerview.widget.RecyclerView.State import com.google.samples.apps.iosched.R import com.google.samples.apps.iosched.shared.domain.sessions.ConferenceDayIndexer import com.google.samples.apps.iosched.shared.util.TimeUtils import com.google.samples.apps.iosched.util.newStaticLayout import kotlin.math.ceil import org.threeten.bp.ZoneId class DaySeparatorItemDecoration( context: Context, indexer: ConferenceDayIndexer, zoneId: ZoneId ) : ItemDecoration() { private val labels: SparseArray private val paint = TextPaint(Paint.ANTI_ALIAS_FLAG or Paint.SUBPIXEL_TEXT_FLAG) private val textWidth: Int private val decorHeight: Int private val verticalBias: Float init { val attrs = context.obtainStyledAttributes( R.style.Widget_IOSched_DaySeparatorDecoration, R.styleable.DaySeparatorDecoration ) val textSize = attrs.getDimension(R.styleable.DaySeparatorDecoration_android_textSize, paint.textSize) paint.textSize = textSize try { paint.typeface = ResourcesCompat.getFont( context, attrs.getResourceIdOrThrow(R.styleable.DaySeparatorDecoration_android_fontFamily) ) } catch (ignored: Exception) { } val textColor = attrs.getColor(R.styleable.DaySeparatorDecoration_android_textColor, Color.BLACK) paint.color = textColor textWidth = attrs.getDimensionPixelSizeOrThrow(R.styleable.DaySeparatorDecoration_android_width) val height = attrs.getDimensionPixelSizeOrThrow(R.styleable.DaySeparatorDecoration_android_height) val minHeight = ceil(textSize).toInt() decorHeight = Math.max(height, minHeight) verticalBias = attrs.getFloat(R.styleable.DaySeparatorDecoration_verticalBias, 0.5f) .coerceIn(0f, 1f) attrs.recycle() labels = buildLabels(context, indexer, zoneId) } private fun buildLabels( context: Context, indexer: ConferenceDayIndexer, zoneId: ZoneId ): SparseArray { val isInConferenceZone = TimeUtils.isConferenceTimeZone(zoneId) val sparseArray = SparseArray() for (day in indexer.days) { val position = indexer.positionForDay(day) val text = context.getString(TimeUtils.getLabelResForDay(day, isInConferenceZone)) val label = newStaticLayout(text, paint, textWidth, ALIGN_CENTER, 1f, 0f, false) sparseArray.put(position, label) } return sparseArray } override fun getItemOffsets(outRect: Rect, child: View, parent: RecyclerView, state: State) { val position = parent.getChildAdapterPosition(child) outRect.top = if (labels.containsKey(position)) decorHeight else 0 } override fun onDraw(canvas: Canvas, parent: RecyclerView, state: State) { val layoutManager = parent.layoutManager ?: return val centerX = parent.width / 2f parent.forEach { child -> if (child.top < parent.height && child.bottom > 0) { // Child is visible val layout = labels[parent.getChildAdapterPosition(child)] if (layout != null) { val dx = centerX - (layout.width / 2) val dy = layoutManager.getDecoratedTop(child) + child.translationY + // offset vertically within the space according to the bias (decorHeight - layout.height) * verticalBias canvas.withTranslation(x = dx, y = dy) { layout.draw(this) } } } } } } ================================================ FILE: mobile/src/main/java/com/google/samples/apps/iosched/ui/schedule/ScheduleFragment.kt ================================================ /* * Copyright 2018 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.ui.schedule import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.Toast import androidx.core.view.WindowInsetsCompat import androidx.core.view.doOnNextLayout import androidx.core.view.updatePadding import androidx.fragment.app.Fragment import androidx.fragment.app.activityViewModels import androidx.fragment.app.viewModels import androidx.navigation.fragment.findNavController import androidx.recyclerview.widget.DefaultItemAnimator import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView.OnScrollListener import androidx.recyclerview.widget.RecyclerView.RecycledViewPool import com.google.samples.apps.iosched.R import com.google.samples.apps.iosched.databinding.FragmentScheduleBinding import com.google.samples.apps.iosched.model.ConferenceDay import com.google.samples.apps.iosched.shared.analytics.AnalyticsActions import com.google.samples.apps.iosched.shared.analytics.AnalyticsHelper import com.google.samples.apps.iosched.shared.di.SearchScheduleEnabledFlag import com.google.samples.apps.iosched.shared.domain.sessions.ConferenceDayIndexer import com.google.samples.apps.iosched.shared.util.TimeUtils import com.google.samples.apps.iosched.ui.MainActivityViewModel import com.google.samples.apps.iosched.ui.messages.SnackbarMessageManager import com.google.samples.apps.iosched.ui.schedule.ScheduleNavigationAction.NavigateToSignInDialogAction import com.google.samples.apps.iosched.ui.schedule.ScheduleNavigationAction.NavigateToSignOutDialogAction import com.google.samples.apps.iosched.ui.schedule.ScheduleNavigationAction.ShowScheduleUiHints import com.google.samples.apps.iosched.ui.sessioncommon.SessionsAdapter import com.google.samples.apps.iosched.ui.signin.NotificationsPreferenceDialogFragment import com.google.samples.apps.iosched.ui.signin.NotificationsPreferenceDialogFragment.Companion.DIALOG_NOTIFICATIONS_PREFERENCE import com.google.samples.apps.iosched.ui.signin.SignInDialogFragment import com.google.samples.apps.iosched.ui.signin.SignInNavigationAction.ShowNotificationPreferencesDialog import com.google.samples.apps.iosched.ui.signin.SignOutDialogFragment import com.google.samples.apps.iosched.ui.signin.setupProfileMenuItem import com.google.samples.apps.iosched.util.clearDecorations import com.google.samples.apps.iosched.util.doOnApplyWindowInsets import com.google.samples.apps.iosched.util.executeAfter import com.google.samples.apps.iosched.util.launchAndRepeatWithViewLifecycle import com.google.samples.apps.iosched.util.requestApplyInsetsWhenAttached import com.google.samples.apps.iosched.util.setContentMaxWidth import com.google.samples.apps.iosched.widget.BubbleDecoration import com.google.samples.apps.iosched.widget.FadingSnackbar import com.google.samples.apps.iosched.widget.JumpSmoothScroller import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.flow.collect import kotlinx.coroutines.launch import javax.inject.Inject import javax.inject.Named /** * The Schedule page of the top-level Activity. */ @AndroidEntryPoint class ScheduleFragment : Fragment() { companion object { private const val DIALOG_NEED_TO_SIGN_IN = "dialog_need_to_sign_in" private const val DIALOG_CONFIRM_SIGN_OUT = "dialog_confirm_sign_out" private const val DIALOG_SCHEDULE_HINTS = "dialog_schedule_hints" } @Inject lateinit var analyticsHelper: AnalyticsHelper @Inject @Named("tagViewPool") lateinit var tagViewPool: RecycledViewPool @Inject @JvmField @SearchScheduleEnabledFlag var searchScheduleFeatureEnabled: Boolean = false @Inject lateinit var snackbarMessageManager: SnackbarMessageManager private val scheduleViewModel: ScheduleViewModel by viewModels() private val scheduleTwoPaneViewModel: ScheduleTwoPaneViewModel by activityViewModels() private val mainActivityViewModel: MainActivityViewModel by activityViewModels() private lateinit var snackbar: FadingSnackbar private lateinit var scheduleRecyclerView: RecyclerView private lateinit var sessionsAdapter: SessionsAdapter private lateinit var scheduleScroller: JumpSmoothScroller private lateinit var dayIndicatorRecyclerView: RecyclerView private lateinit var dayIndicatorAdapter: DayIndicatorAdapter private lateinit var dayIndicatorItemDecoration: BubbleDecoration private lateinit var dayIndexer: ConferenceDayIndexer private var cachedBubbleRange: IntRange? = null private lateinit var binding: FragmentScheduleBinding override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View { binding = FragmentScheduleBinding.inflate(inflater, container, false).apply { lifecycleOwner = viewLifecycleOwner viewModel = scheduleViewModel } snackbar = binding.snackbar scheduleRecyclerView = binding.recyclerviewSchedule dayIndicatorRecyclerView = binding.dayIndicators return binding.root } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) // Set up search menu item binding.toolbar.run { inflateMenu(R.menu.schedule_menu) menu.findItem(R.id.search).isVisible = searchScheduleFeatureEnabled setOnMenuItemClickListener { item -> if (item.itemId == R.id.search) { analyticsHelper.logUiEvent("Navigate to Search", AnalyticsActions.CLICK) openSearch() true } else { false } } } binding.toolbar.setupProfileMenuItem(mainActivityViewModel, this) // Pad the bottom of the RecyclerView so that the content scrolls up above the nav bar binding.recyclerviewSchedule.doOnApplyWindowInsets { v, insets, padding -> val systemInsets = insets.getInsets( WindowInsetsCompat.Type.systemBars() or WindowInsetsCompat.Type.ime() ) v.updatePadding(bottom = padding.bottom + systemInsets.bottom) } // Session list configuration sessionsAdapter = SessionsAdapter( tagViewPool, scheduleViewModel.showReservations, scheduleViewModel.timeZoneId, viewLifecycleOwner, scheduleTwoPaneViewModel, // OnSessionClickListener scheduleTwoPaneViewModel // OnSessionStarClickListener ) scheduleRecyclerView.apply { adapter = sessionsAdapter (itemAnimator as DefaultItemAnimator).run { supportsChangeAnimations = false addDuration = 160L moveDuration = 160L changeDuration = 160L removeDuration = 120L } addOnScrollListener(object : OnScrollListener() { override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) { onScheduleScrolled() } override fun onScrollStateChanged(recyclerView: RecyclerView, newState: Int) { scheduleViewModel.userHasInteracted = true } }) } binding.swipeRefreshLayout.doOnNextLayout { setContentMaxWidth(it) } scheduleScroller = JumpSmoothScroller(view.context) dayIndicatorItemDecoration = BubbleDecoration(view.context) dayIndicatorRecyclerView.addItemDecoration(dayIndicatorItemDecoration) dayIndicatorAdapter = DayIndicatorAdapter(scheduleViewModel, viewLifecycleOwner) dayIndicatorRecyclerView.adapter = dayIndicatorAdapter // Start observing ViewModels launchAndRepeatWithViewLifecycle { launch { scheduleViewModel.scheduleUiData.collect { updateScheduleUi(it) } } // During conference, scroll to current event. launch { scheduleViewModel.scrollToEvent.collect { scrollEvent -> if (scrollEvent.targetPosition != -1) { scheduleRecyclerView.run { post { val lm = layoutManager as LinearLayoutManager if (scrollEvent.smoothScroll) { scheduleScroller.targetPosition = scrollEvent.targetPosition lm.startSmoothScroll(scheduleScroller) } else { lm.scrollToPositionWithOffset(scrollEvent.targetPosition, 0) } } } } } } launch { scheduleViewModel.navigationActions.collect { when (it) { is NavigateToSignInDialogAction -> openSignInDialog() is NavigateToSignOutDialogAction -> openSignOutDialog() is ShowScheduleUiHints -> openScheduleUiHintsDialog() } } } launch { scheduleViewModel.signInNavigationActions.collect { if (it == ShowNotificationPreferencesDialog) { openNotificationsPreferenceDialog() } } } // Show an error message launch { scheduleViewModel.errorMessage.collect { errorMsg -> Toast.makeText(context, errorMsg, Toast.LENGTH_LONG).show() } } } if (savedInstanceState == null) { // VM outlives the UI, so reset this flag when a new Schedule page is shown scheduleViewModel.userHasInteracted = false binding.coordinatorLayout.postDelayed( { binding.coordinatorLayout.requestApplyInsetsWhenAttached() }, 500 ) } analyticsHelper.sendScreenView("Schedule", requireActivity()) } private fun updateScheduleUi(scheduleUiData: ScheduleUiData) { // Require everything to be loaded. val list = scheduleUiData.list ?: return val timeZoneId = scheduleUiData.timeZoneId ?: return val indexer = scheduleUiData.dayIndexer ?: return dayIndexer = indexer // Prevent building new indicators until we get scroll information. cachedBubbleRange = null if (indexer.days.isEmpty()) { // Special case: the results are empty, so we won't get valid scroll information. // Set a bogus range to and rebuild the day indicators. cachedBubbleRange = -1..-1 rebuildDayIndicators() } sessionsAdapter.submitList(list) scheduleRecyclerView.run { // Recreate the decoration used for the sticky time headers clearDecorations() if (list.isNotEmpty()) { addItemDecoration( ScheduleTimeHeadersDecoration( context, list.map { it.session }, timeZoneId ) ) addItemDecoration( DaySeparatorItemDecoration( context, indexer, timeZoneId ) ) } } binding.executeAfter { isEmpty = list.isEmpty() } } private fun rebuildDayIndicators() { // cachedBubbleRange will get set once we have scroll information, so wait until then. val bubbleRange = cachedBubbleRange ?: return val indicators = if (dayIndexer.days.isEmpty()) { TimeUtils.ConferenceDays.map { day: ConferenceDay -> DayIndicator(day = day, enabled = false) } } else { dayIndexer.days.mapIndexed { index: Int, day: ConferenceDay -> DayIndicator(day = day, checked = index in bubbleRange) } } dayIndicatorAdapter.submitList(indicators) dayIndicatorItemDecoration.bubbleRange = bubbleRange } private fun onScheduleScrolled() { val layoutManager = (scheduleRecyclerView.layoutManager) as LinearLayoutManager val first = layoutManager.findFirstVisibleItemPosition() val last = layoutManager.findLastVisibleItemPosition() if (first < 0 || last < 0) { // When the list is empty, we get -1 for the positions. return } val firstDay = dayIndexer.dayForPosition(first) ?: return val lastDay = dayIndexer.dayForPosition(last) ?: return val highlightRange = dayIndexer.days.indexOf(firstDay)..dayIndexer.days.indexOf(lastDay) if (highlightRange != cachedBubbleRange) { cachedBubbleRange = highlightRange rebuildDayIndicators() } } private fun openSearch() { findNavController().navigate(ScheduleFragmentDirections.toSearch()) } private fun openSignInDialog() { val dialog = SignInDialogFragment() dialog.show(requireActivity().supportFragmentManager, DIALOG_NEED_TO_SIGN_IN) } private fun openSignOutDialog() { val dialog = SignOutDialogFragment() dialog.show(requireActivity().supportFragmentManager, DIALOG_CONFIRM_SIGN_OUT) } private fun openScheduleUiHintsDialog() { val dialog = ScheduleUiHintsDialogFragment() dialog.show(requireActivity().supportFragmentManager, DIALOG_SCHEDULE_HINTS) } private fun openNotificationsPreferenceDialog() { val dialog = NotificationsPreferenceDialogFragment() dialog.show(requireActivity().supportFragmentManager, DIALOG_NOTIFICATIONS_PREFERENCE) } } ================================================ FILE: mobile/src/main/java/com/google/samples/apps/iosched/ui/schedule/ScheduleItemBindingAdapter.kt ================================================ /* * Copyright 2018 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.ui.schedule import android.view.View.GONE import android.view.View.VISIBLE import android.widget.TextView import androidx.databinding.BindingAdapter import com.google.samples.apps.iosched.R import com.google.samples.apps.iosched.model.Room import com.google.samples.apps.iosched.model.userdata.UserEvent import com.google.samples.apps.iosched.shared.util.TimeUtils import com.google.samples.apps.iosched.ui.reservation.ReservationTextView import com.google.samples.apps.iosched.ui.reservation.ReservationViewState import org.threeten.bp.ZoneId import org.threeten.bp.ZonedDateTime @BindingAdapter( "sessionStart", "timeZoneId", "showTime", "sessionRoom", requireAll = true ) fun sessionDateTimeLocation( textView: TextView, startTime: ZonedDateTime?, zoneId: ZoneId?, showTime: Boolean, room: Room? ) { startTime ?: return zoneId ?: return val roomName = room?.name ?: "-" val localStartTime = TimeUtils.zonedTime(startTime, zoneId) // For a11y, always use date, time, and location -> "May 7, 10:00 AM / Amphitheatre val dateTimeString = TimeUtils.dateTimeString(localStartTime) val contentDescription = textView.resources.getString( R.string.session_duration_location, dateTimeString, roomName ) textView.contentDescription = contentDescription textView.text = if (showTime) { // Show date, time, and location, so just reuse the content description contentDescription } else if (!TimeUtils.isConferenceTimeZone(zoneId)) { // Show date and location -> "May 7 / Amphitheatre" val dateString = TimeUtils.dateString(localStartTime) textView.resources.getString( R.string.session_duration_location, dateString, roomName ) } else { // Show location only roomName } } @BindingAdapter( "reservationStatus", "showReservations", "isReservable", requireAll = true ) fun setReservationStatus( textView: ReservationTextView, userEvent: UserEvent?, showReservations: Boolean, isReservable: Boolean ) { when (isReservable && showReservations) { true -> { val reservationUnavailable = false // TODO determine this condition textView.status = ReservationViewState.fromUserEvent(userEvent, reservationUnavailable) textView.visibility = VISIBLE } false -> { textView.visibility = GONE } } } ================================================ FILE: mobile/src/main/java/com/google/samples/apps/iosched/ui/schedule/ScheduleNavigationAction.kt ================================================ /* * Copyright 2021 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.ui.schedule sealed class ScheduleNavigationAction { object NavigateToSignInDialogAction : ScheduleNavigationAction() object NavigateToSignOutDialogAction : ScheduleNavigationAction() object ShowScheduleUiHints : ScheduleNavigationAction() } ================================================ FILE: mobile/src/main/java/com/google/samples/apps/iosched/ui/schedule/ScheduleTimeHeadersDecoration.kt ================================================ /* * Copyright 2018 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.ui.schedule import android.content.Context import android.graphics.Canvas import android.graphics.Paint.ANTI_ALIAS_FLAG import android.graphics.Typeface import android.text.Layout.Alignment.ALIGN_CENTER import android.text.SpannableStringBuilder import android.text.StaticLayout import android.text.TextPaint import android.text.style.AbsoluteSizeSpan import android.text.style.StyleSpan import android.view.View import androidx.core.content.res.ResourcesCompat import androidx.core.content.res.getColorOrThrow import androidx.core.content.res.getDimensionPixelSizeOrThrow import androidx.core.content.res.getResourceIdOrThrow import androidx.core.graphics.withTranslation import androidx.core.text.inSpans import androidx.core.view.isEmpty import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView.ItemDecoration import androidx.recyclerview.widget.RecyclerView.State import com.google.samples.apps.iosched.R import com.google.samples.apps.iosched.model.Session import com.google.samples.apps.iosched.util.isRtl import com.google.samples.apps.iosched.util.newStaticLayout import org.threeten.bp.ZoneId import org.threeten.bp.ZonedDateTime import org.threeten.bp.format.DateTimeFormatter import timber.log.Timber /** * A [RecyclerView.ItemDecoration] which draws sticky headers for a given list of sessions. */ class ScheduleTimeHeadersDecoration( context: Context, sessions: List, zoneId: ZoneId ) : ItemDecoration() { private val paint: TextPaint private val width: Int private val padding: Int private val timeTextSize: Int private val meridiemTextSize: Int private val timeFormatter = DateTimeFormatter.ofPattern("h:mm") private val meridiemFormatter = DateTimeFormatter.ofPattern("a") private val timeTextSizeSpan: AbsoluteSizeSpan private val meridiemTextSizeSpan: AbsoluteSizeSpan private val boldSpan = StyleSpan(Typeface.BOLD) init { val attrs = context.obtainStyledAttributes( R.style.Widget_IOSched_TimeHeaders, R.styleable.TimeHeader ) paint = TextPaint(ANTI_ALIAS_FLAG).apply { color = attrs.getColorOrThrow(R.styleable.TimeHeader_android_textColor) try { typeface = ResourcesCompat.getFont( context, attrs.getResourceIdOrThrow(R.styleable.TimeHeader_android_fontFamily) ) } catch (_: Exception) { // ignore } } width = attrs.getDimensionPixelSizeOrThrow(R.styleable.TimeHeader_android_width) padding = attrs.getDimensionPixelSize(R.styleable.TimeHeader_android_padding, 0) timeTextSize = attrs.getDimensionPixelSizeOrThrow(R.styleable.TimeHeader_timeTextSize) meridiemTextSize = attrs.getDimensionPixelSizeOrThrow(R.styleable.TimeHeader_meridiemTextSize) attrs.recycle() timeTextSizeSpan = AbsoluteSizeSpan(timeTextSize) meridiemTextSizeSpan = AbsoluteSizeSpan(meridiemTextSize) } // Get the sessions index:start time and create header layouts for each private val timeSlots: Map = indexSessionHeaders(sessions, zoneId).map { it.first to createHeader(it.second) }.toMap() /** * Loop over each child and draw any corresponding headers i.e. items who's position is a key in * [timeSlots]. We also look back to see if there are any headers _before_ the first header we * found i.e. which needs to be sticky. */ override fun onDrawOver(c: Canvas, parent: RecyclerView, state: State) { if (timeSlots.isEmpty() || parent.isEmpty()) return val isRtl = parent.isRtl() if (isRtl) { c.save() c.translate((parent.width - width).toFloat(), 0f) } val parentPadding = parent.paddingTop var earliestPosition = Int.MAX_VALUE var previousHeaderPosition = -1 var previousHasHeader = false var earliestChild: View? = null for (i in parent.childCount - 1 downTo 0) { val child = parent.getChildAt(i) if (child == null) { // This should not be null, but observed null at times. // Guard against it to avoid crash and log the state. Timber.w( """View is null. Index: $i, childCount: ${parent.childCount}, |RecyclerView.State: $state""".trimMargin() ) continue } if (child.y > parent.height || (child.y + child.height) < 0) { // Can't see this child continue } val position = parent.getChildAdapterPosition(child) if (position < 0) { continue } if (position < earliestPosition) { earliestPosition = position earliestChild = child } val header = timeSlots[position] if (header != null) { drawHeader(c, child, parentPadding, header, child.alpha, previousHasHeader) previousHeaderPosition = position previousHasHeader = true } else { previousHasHeader = false } } if (earliestChild != null && earliestPosition != previousHeaderPosition) { // This child needs a sicky header findHeaderBeforePosition(earliestPosition)?.let { stickyHeader -> previousHasHeader = previousHeaderPosition - earliestPosition == 1 drawHeader(c, earliestChild, parentPadding, stickyHeader, 1f, previousHasHeader) } } if (isRtl) { c.restore() } } private fun findHeaderBeforePosition(position: Int): StaticLayout? { for (headerPos in timeSlots.keys.reversed()) { if (headerPos < position) { return timeSlots[headerPos] } } return null } private fun drawHeader( canvas: Canvas, child: View, parentPadding: Int, header: StaticLayout, headerAlpha: Float, previousHasHeader: Boolean ) { val childTop = child.y.toInt() val childBottom = childTop + child.height var top = (childTop + padding).coerceAtLeast(parentPadding) if (previousHasHeader) { top = top.coerceAtMost(childBottom - header.height - padding) } paint.alpha = (headerAlpha * 255).toInt() canvas.withTranslation(y = top.toFloat()) { header.draw(canvas) } } /** * Create a header layout for the given [startTime]. */ private fun createHeader(startTime: ZonedDateTime): StaticLayout { val text = SpannableStringBuilder().apply { inSpans(timeTextSizeSpan) { append(timeFormatter.format(startTime)) } append(System.lineSeparator()) inSpans(meridiemTextSizeSpan, boldSpan) { append(meridiemFormatter.format(startTime).toUpperCase()) } } return newStaticLayout(text, paint, width, ALIGN_CENTER, 1f, 0f, false) } } ================================================ FILE: mobile/src/main/java/com/google/samples/apps/iosched/ui/schedule/ScheduleTwoPaneFragment.kt ================================================ /* * Copyright 2021 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.ui.schedule import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.activity.OnBackPressedCallback import androidx.core.view.doOnNextLayout import androidx.fragment.app.activityViewModels import androidx.navigation.NavController import androidx.navigation.NavDestination import androidx.navigation.fragment.NavHostFragment import androidx.slidingpanelayout.widget.SlidingPaneLayout import com.google.samples.apps.iosched.R import com.google.samples.apps.iosched.ScheduleDetailNavGraphDirections import com.google.samples.apps.iosched.databinding.FragmentScheduleTwoPaneBinding import com.google.samples.apps.iosched.ui.MainNavigationFragment import com.google.samples.apps.iosched.ui.messages.SnackbarMessageManager import com.google.samples.apps.iosched.ui.messages.setupSnackbarManager import com.google.samples.apps.iosched.ui.signin.SignInDialogFragment import com.google.samples.apps.iosched.util.launchAndRepeatWithViewLifecycle import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.flow.collect import kotlinx.coroutines.launch import javax.inject.Inject @AndroidEntryPoint class ScheduleTwoPaneFragment : MainNavigationFragment() { @Inject lateinit var snackbarMessageManager: SnackbarMessageManager private val scheduleTwoPaneViewModel: ScheduleTwoPaneViewModel by activityViewModels() private lateinit var binding: FragmentScheduleTwoPaneBinding private lateinit var listPaneNavController: NavController private lateinit var detailPaneNavController: NavController private val backPressHandler = BackPressHandler() override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View { binding = FragmentScheduleTwoPaneBinding.inflate(inflater, container, false) return binding.root } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) setupSnackbarManager(snackbarMessageManager, binding.snackbar) binding.slidingPaneLayout.apply { // Disable dragging the detail pane. lockMode = SlidingPaneLayout.LOCK_MODE_LOCKED // Listen for movement of the detail pane. addPanelSlideListener(backPressHandler) } childFragmentManager.run { listPaneNavController = (findFragmentById(R.id.list_pane) as NavHostFragment).navController detailPaneNavController = (findFragmentById(R.id.detail_pane) as NavHostFragment).navController listPaneNavController.addOnDestinationChangedListener(backPressHandler) detailPaneNavController.addOnDestinationChangedListener(backPressHandler) } binding.slidingPaneLayout.doOnNextLayout { scheduleTwoPaneViewModel.setIsTwoPane(!binding.slidingPaneLayout.isSlideable) } launchAndRepeatWithViewLifecycle { launch { scheduleTwoPaneViewModel.selectSessionEvents.collect { sessionId -> detailPaneNavController.navigate( ScheduleDetailNavGraphDirections.toSessionDetail(sessionId) ) // On narrow screens, slide the detail pane over the list pane if it isn't already // on top. If both panes are visible, this will have no effect. binding.slidingPaneLayout.open() } } launch { scheduleTwoPaneViewModel.navigateToSignInDialogEvents.collect { openSignInDialog() } } launch { scheduleTwoPaneViewModel.returnToListPaneEvents.collect { binding.slidingPaneLayout.close() } } } requireActivity().onBackPressedDispatcher.addCallback(viewLifecycleOwner, backPressHandler) } // TODO convert this to a dialog destination in the nav graph private fun openSignInDialog() { val dialog = SignInDialogFragment() dialog.show(requireActivity().supportFragmentManager, SignInDialogFragment.DIALOG_SIGN_IN) } /** Handles back button press while this fragment is on screen. */ inner class BackPressHandler : OnBackPressedCallback(false), SlidingPaneLayout.PanelSlideListener, NavController.OnDestinationChangedListener { override fun handleOnBackPressed() { // Back press can have three possible effects that we check for in order. // 1. In the detail pane, go back from Speaker Detail to Session Detail. val listDestination = listPaneNavController.currentDestination?.id val detailDestination = detailPaneNavController.currentDestination?.id var done = false if (detailDestination == R.id.navigation_speaker_detail) { done = detailPaneNavController.popBackStack() } // 2. On narrow screens, if the detail pane is in front, "go back" by sliding it away. if (!done) { done = binding.slidingPaneLayout.closePane() } // 3. Try to pop the list pane, e.g. back from Search to Schedule. if (!done && listDestination == R.id.navigation_schedule_search) { listPaneNavController.popBackStack() } syncEnabledState() } override fun onPanelSlide(panel: View, slideOffset: Float) { // noop } override fun onPanelOpened(panel: View) { syncEnabledState() } override fun onPanelClosed(panel: View) { syncEnabledState() } override fun onDestinationChanged( controller: NavController, destination: NavDestination, arguments: Bundle? ) { syncEnabledState() } private fun syncEnabledState() { val listDestination = listPaneNavController.currentDestination?.id val detailDestination = detailPaneNavController.currentDestination?.id isEnabled = listDestination == R.id.navigation_schedule_search || detailDestination == R.id.navigation_speaker_detail || (binding.slidingPaneLayout.isSlideable && binding.slidingPaneLayout.isOpen) } } } ================================================ FILE: mobile/src/main/java/com/google/samples/apps/iosched/ui/schedule/ScheduleTwoPaneViewModel.kt ================================================ /* * Copyright 2021 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.ui.schedule import androidx.lifecycle.ViewModel import com.google.samples.apps.iosched.model.SessionId import com.google.samples.apps.iosched.shared.util.tryOffer import com.google.samples.apps.iosched.ui.sessioncommon.OnSessionClickListener import com.google.samples.apps.iosched.ui.sessioncommon.OnSessionStarClickDelegate import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.channels.Channel import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.receiveAsFlow import javax.inject.Inject // Note: clients should obtain this from the Activity. @HiltViewModel class ScheduleTwoPaneViewModel @Inject constructor( onSessionStarClickDelegate: OnSessionStarClickDelegate ) : ViewModel(), OnSessionClickListener, OnSessionStarClickDelegate by onSessionStarClickDelegate { private val _isTwoPane = MutableStateFlow(false) val isTwoPane: StateFlow = _isTwoPane private val _returnToListPaneEvents = Channel(capacity = Channel.CONFLATED) val returnToListPaneEvents = _returnToListPaneEvents.receiveAsFlow() private val _selectSessionEvents = Channel(capacity = Channel.CONFLATED) val selectSessionEvents = _selectSessionEvents.receiveAsFlow() fun setIsTwoPane(isTwoPane: Boolean) { _isTwoPane.value = isTwoPane } fun returnToListPane() { _returnToListPaneEvents.tryOffer(Unit) } override fun openEventDetail(id: SessionId) { _selectSessionEvents.tryOffer(id) } } ================================================ FILE: mobile/src/main/java/com/google/samples/apps/iosched/ui/schedule/ScheduleUiHintsDialogFragment.kt ================================================ /* * Copyright 2018 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.ui.schedule import android.app.Dialog import android.content.DialogInterface import android.os.Bundle import androidx.appcompat.app.AppCompatDialogFragment import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.samples.apps.iosched.R import com.google.samples.apps.iosched.shared.di.ApplicationScope import com.google.samples.apps.iosched.shared.domain.prefs.MarkScheduleUiHintsShownUseCase import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.launch import javax.inject.Inject /** * Dialog that shows the hints for the schedule. */ @AndroidEntryPoint class ScheduleUiHintsDialogFragment : AppCompatDialogFragment() { @Inject lateinit var markScheduleUiHintsShownUseCase: MarkScheduleUiHintsShownUseCase @Inject @ApplicationScope lateinit var applicationScope: CoroutineScope override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { return MaterialAlertDialogBuilder(requireContext()) .setTitle(R.string.schedule_hint_title) .setView(R.layout.dialog_schedule_hints) .setPositiveButton(R.string.got_it, null) .create() } override fun onDismiss(dialog: DialogInterface) { applicationScope.launch { markScheduleUiHintsShownUseCase(Unit) } super.onDismiss(dialog) } } ================================================ FILE: mobile/src/main/java/com/google/samples/apps/iosched/ui/schedule/ScheduleViewModel.kt ================================================ /* * Copyright 2018 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.ui.schedule import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.google.samples.apps.iosched.model.ConferenceDay import com.google.samples.apps.iosched.model.userdata.UserSession import com.google.samples.apps.iosched.shared.domain.RefreshConferenceDataUseCase import com.google.samples.apps.iosched.shared.domain.prefs.ScheduleUiHintsShownUseCase import com.google.samples.apps.iosched.shared.domain.sessions.ConferenceDayIndexer import com.google.samples.apps.iosched.shared.domain.sessions.LoadScheduleUserSessionsParameters import com.google.samples.apps.iosched.shared.domain.sessions.LoadScheduleUserSessionsResult import com.google.samples.apps.iosched.shared.domain.sessions.LoadScheduleUserSessionsUseCase import com.google.samples.apps.iosched.shared.domain.sessions.ObserveConferenceDataUseCase import com.google.samples.apps.iosched.shared.domain.settings.GetTimeZoneUseCase import com.google.samples.apps.iosched.shared.fcm.TopicSubscriber import com.google.samples.apps.iosched.shared.result.Result import com.google.samples.apps.iosched.shared.result.Result.Error import com.google.samples.apps.iosched.shared.result.Result.Success import com.google.samples.apps.iosched.shared.result.data import com.google.samples.apps.iosched.shared.result.successOr import com.google.samples.apps.iosched.shared.util.TimeUtils import com.google.samples.apps.iosched.shared.util.tryOffer import com.google.samples.apps.iosched.ui.messages.SnackbarMessage import com.google.samples.apps.iosched.ui.messages.SnackbarMessageManager import com.google.samples.apps.iosched.ui.schedule.ScheduleNavigationAction.ShowScheduleUiHints import com.google.samples.apps.iosched.ui.sessioncommon.stringRes import com.google.samples.apps.iosched.ui.signin.SignInViewModelDelegate import com.google.samples.apps.iosched.util.WhileViewSubscribed import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.channels.BufferOverflow.DROP_LATEST import kotlinx.coroutines.channels.BufferOverflow.DROP_OLDEST import kotlinx.coroutines.channels.Channel import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.SharedFlow import kotlinx.coroutines.flow.SharingStarted.Companion.Lazily import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.collect import kotlinx.coroutines.flow.combineTransform import kotlinx.coroutines.flow.emitAll import kotlinx.coroutines.flow.flow import kotlinx.coroutines.flow.mapLatest import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.flow.receiveAsFlow import kotlinx.coroutines.flow.shareIn import kotlinx.coroutines.flow.stateIn import kotlinx.coroutines.launch import org.threeten.bp.ZoneId import javax.inject.Inject /** * Loads data and exposes it to the view. * By annotating the constructor with [@Inject], Dagger will use that constructor when needing to * create the object, so defining a [@Provides] method for this class won't be needed. */ @HiltViewModel class ScheduleViewModel @Inject constructor( private val loadScheduleUserSessionsUseCase: LoadScheduleUserSessionsUseCase, signInViewModelDelegate: SignInViewModelDelegate, scheduleUiHintsShownUseCase: ScheduleUiHintsShownUseCase, topicSubscriber: TopicSubscriber, private val snackbarMessageManager: SnackbarMessageManager, getTimeZoneUseCase: GetTimeZoneUseCase, private val refreshConferenceDataUseCase: RefreshConferenceDataUseCase, observeConferenceDataUseCase: ObserveConferenceDataUseCase ) : ViewModel(), SignInViewModelDelegate by signInViewModelDelegate { // Exposed to the view as a StateFlow but it's a one-shot operation. val timeZoneId = flow { if (getTimeZoneUseCase(Unit).successOr(true)) { emit(TimeUtils.CONFERENCE_TIMEZONE) } else { emit(ZoneId.systemDefault()) } }.stateIn(viewModelScope, Lazily, TimeUtils.CONFERENCE_TIMEZONE) val isConferenceTimeZone: StateFlow = timeZoneId.mapLatest { zoneId -> TimeUtils.isConferenceTimeZone(zoneId) }.stateIn(viewModelScope, Lazily, true) private lateinit var dayIndexer: ConferenceDayIndexer // Used to re-run flows on command private val refreshSignal = MutableSharedFlow() // Used to run flows on init and also on command private val loadDataSignal: Flow = flow { emit(Unit) emitAll(refreshSignal) } // Event coming from repository indicating data should be refreshed init { viewModelScope.launch { observeConferenceDataUseCase(Unit).collect { refreshUserSessions() } } } // Latest user ID private val currentUserId = userId.stateIn(viewModelScope, WhileViewSubscribed, null) // Refresh sessions when needed and when the user changes private val loadSessionsResult: StateFlow> = loadDataSignal.combineTransform(currentUserId) { _, userId -> emitAll( loadScheduleUserSessionsUseCase( LoadScheduleUserSessionsParameters(userId) ) ) } .onEach { // Side effect: show error messages coming from LoadScheduleUserSessionsUseCase if (it is Error) { _errorMessage.tryOffer(it.exception.message ?: "Error") } // Side effect: show snackbar if the result contains a message if (it is Success) { it.data.userMessage?.type?.stringRes()?.let { messageId -> // There is a message to display: snackbarMessageManager.addMessage( SnackbarMessage( messageId = messageId, longDuration = true, session = it.data.userMessageSession, requestChangeId = it.data.userMessage?.changeRequestId ) ) } } } .stateIn(viewModelScope, WhileViewSubscribed, Result.Loading) val isLoading: StateFlow = loadSessionsResult.mapLatest { it == Result.Loading }.stateIn(viewModelScope, WhileViewSubscribed, true) // Expose new UI data when loadSessionsResult changes val scheduleUiData: StateFlow = loadSessionsResult.combineTransform(timeZoneId) { sessions, timeZone -> sessions.data?.let { data -> dayIndexer = data.dayIndexer emit( ScheduleUiData( list = data.userSessions, dayIndexer = data.dayIndexer, timeZoneId = timeZone ) ) } }.stateIn(viewModelScope, WhileViewSubscribed, ScheduleUiData()) private val _swipeRefreshing = MutableStateFlow(false) val swipeRefreshing: StateFlow = _swipeRefreshing /** Flows for Actions and Events **/ // SIDE EFFECTS: Error messages // Guard against too many error messages by limiting to 3, keeping the oldest. private val _errorMessage = Channel(1, DROP_LATEST) val errorMessage: Flow = _errorMessage.receiveAsFlow().shareIn(viewModelScope, WhileViewSubscribed) // SIDE EFFECTS: Navigation actions private val _navigationActions = Channel(capacity = Channel.CONFLATED) // Exposed with receiveAsFlow to make sure that only one observer receives updates. val navigationActions = _navigationActions.receiveAsFlow() /** Show hints for the schedule if they haven't been shown yet */ init { viewModelScope.launch { scheduleUiHintsShownUseCase(Unit).successOr(false).let { scheduleHintsShown -> if (!scheduleHintsShown) { _navigationActions.tryOffer(ShowScheduleUiHints) } } } } // Flags used to indicate if the "scroll to now" feature has been used already. var userHasInteracted = false // Flow describing which item to scroll to automatically. // Using a MutableSharedFlow so a new value can be emitted from a user event and so // the values are not replayed. private val currentEventIndex = MutableSharedFlow( extraBufferCapacity = 1, onBufferOverflow = DROP_OLDEST ) val scrollToEvent: SharedFlow = loadSessionsResult.combineTransform(currentEventIndex) { result, currentEventIndex -> if (userHasInteracted) { // Setting smoothScroll to false as it's an unnecessary delay. emit(ScheduleScrollEvent(currentEventIndex, smoothScroll = false)) } else { val index = result.data?.firstUnfinishedSessionIndex ?: return@combineTransform if (index != -1) { // User hasn't interacted yet and conference is happening emit(ScheduleScrollEvent(index)) } else { // User hasn't interacted but conference not in progress, scroll to first event emit(ScheduleScrollEvent(currentEventIndex)) } } }.shareIn(viewModelScope, WhileViewSubscribed, replay = 0) // Don't replay on rotation init { // Subscribe user to schedule updates topicSubscriber.subscribeToScheduleUpdates() } fun onSwipeRefresh() { viewModelScope.launch { // Ask repository to fetch new data _swipeRefreshing.emit(true) refreshConferenceDataUseCase(Any()) _swipeRefreshing.emit(false) } } private fun refreshUserSessions() { refreshSignal.tryEmit(Unit) } fun scrollToStartOfDay(day: ConferenceDay) { currentEventIndex.tryEmit(dayIndexer.positionForDay(day)) } } data class ScheduleUiData( val list: List? = null, val timeZoneId: ZoneId? = null, val dayIndexer: ConferenceDayIndexer? = null ) data class ScheduleScrollEvent(val targetPosition: Int, val smoothScroll: Boolean = false) ================================================ FILE: mobile/src/main/java/com/google/samples/apps/iosched/ui/schedule/SessionHeaderIndexer.kt ================================================ /* * Copyright 2018 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.ui.schedule import com.google.samples.apps.iosched.model.Session import com.google.samples.apps.iosched.shared.util.TimeUtils import org.threeten.bp.ZoneId import org.threeten.bp.ZonedDateTime import org.threeten.bp.temporal.ChronoUnit /** * Find the first session at each start time (rounded down to nearest minute) and return pairs of * index to start time. Assumes that [sessions] are sorted by ascending start time. */ fun indexSessionHeaders(sessions: List, zoneId: ZoneId): List> { return sessions .mapIndexed { index, session -> index to TimeUtils.zonedTime(session.startTime, zoneId) } .distinctBy { it.second.truncatedTo(ChronoUnit.MINUTES) } } ================================================ FILE: mobile/src/main/java/com/google/samples/apps/iosched/ui/search/SearchFilterFragment.kt ================================================ /* * Copyright 2020 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.ui.search import androidx.fragment.app.viewModels import com.google.samples.apps.iosched.ui.filters.FiltersFragment import com.google.samples.apps.iosched.ui.filters.FiltersViewModelDelegate import dagger.hilt.android.AndroidEntryPoint @AndroidEntryPoint class SearchFilterFragment : FiltersFragment() { private val viewModel: SearchViewModel by viewModels( ownerProducer = { requireParentFragment() } ) override fun resolveViewModelDelegate(): FiltersViewModelDelegate { return viewModel } } ================================================ FILE: mobile/src/main/java/com/google/samples/apps/iosched/ui/search/SearchFragment.kt ================================================ /* * Copyright 2019 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.ui.search import android.os.Bundle import android.view.ContextThemeWrapper import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.SearchView import androidx.core.view.ViewCompat import androidx.core.view.WindowInsetsCompat import androidx.core.view.doOnNextLayout import androidx.core.view.updatePadding import androidx.fragment.app.Fragment import androidx.fragment.app.activityViewModels import androidx.fragment.app.viewModels import androidx.recyclerview.widget.RecyclerView.RecycledViewPool import com.google.samples.apps.iosched.R import com.google.samples.apps.iosched.databinding.FragmentSearchBinding import com.google.samples.apps.iosched.databinding.SearchActiveFiltersNarrowBinding import com.google.samples.apps.iosched.databinding.SearchActiveFiltersWideBinding import com.google.samples.apps.iosched.shared.analytics.AnalyticsHelper import com.google.samples.apps.iosched.ui.schedule.ScheduleTwoPaneViewModel import com.google.samples.apps.iosched.ui.sessioncommon.SessionsAdapter import com.google.samples.apps.iosched.util.doOnApplyWindowInsets import com.google.samples.apps.iosched.util.launchAndRepeatWithViewLifecycle import com.google.samples.apps.iosched.util.setContentMaxWidth import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.flow.collect import javax.inject.Inject import javax.inject.Named @AndroidEntryPoint class SearchFragment : Fragment() { @Inject lateinit var analyticsHelper: AnalyticsHelper @Inject @Named("tagViewPool") lateinit var tagViewPool: RecycledViewPool private lateinit var binding: FragmentSearchBinding private val viewModel: SearchViewModel by viewModels() private val scheduleTwoPaneViewModel: ScheduleTwoPaneViewModel by activityViewModels() private lateinit var sessionsAdapter: SessionsAdapter override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View { val themedInflater = inflater.cloneInContext(ContextThemeWrapper(requireActivity(), R.style.AppTheme_Detail)) binding = FragmentSearchBinding.inflate(themedInflater, container, false).apply { lifecycleOwner = viewLifecycleOwner } return binding.root } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) binding.viewModel = viewModel binding.toolbar.apply { inflateMenu(R.menu.search_menu) setOnMenuItemClickListener { if (it.itemId == R.id.action_open_filters) { findFiltersFragment().showFiltersSheet() true } else { false } } } binding.searchView.apply { setOnQueryTextListener(object : SearchView.OnQueryTextListener { override fun onQueryTextSubmit(query: String): Boolean { dismissKeyboard(this@apply) return true } override fun onQueryTextChange(newText: String): Boolean { viewModel.onSearchQueryChanged(newText) return true } }) // Set focus on the SearchView and open the keyboard setOnQueryTextFocusChangeListener { view, hasFocus -> if (hasFocus) { showKeyboard(view.findFocus()) } } requestFocus() } sessionsAdapter = SessionsAdapter( tagViewPool, viewModel.showReservations, viewModel.timeZoneId, viewLifecycleOwner, scheduleTwoPaneViewModel, // OnSessionClickListener scheduleTwoPaneViewModel // OnSessionStarClickListener ) binding.recyclerView.apply { adapter = sessionsAdapter doOnApplyWindowInsets { v, insets, padding -> val systemInsets = insets.getInsets( WindowInsetsCompat.Type.systemBars() or WindowInsetsCompat.Type.ime() ) v.updatePadding(bottom = padding.bottom + systemInsets.bottom) } doOnNextLayout { setContentMaxWidth(this) } } launchAndRepeatWithViewLifecycle { viewModel.searchResults.collect { sessionsAdapter.submitList(it) } } /* The active filters on Search can appear in one of two places: * - In the toolbar next to the search field (on wide screens) * - In the app bar below the toolbar (on narrow screens) * * Normally this could be handled by a resource with a width qualifier, e.g. layout-w720dp. * However, Search can appear in the list pane of a two pane layout. When both panes are * visible, a resource qualifier like the above will give us the "wide" state (based on the * device width) when we actually want the "narrow" state (based on the list pane width). * Instead we check the toolbar width after first layout and inflate one of two ViewStubs. */ binding.toolbar.doOnNextLayout { toolbar -> val threshold = resources.getDimensionPixelSize(R.dimen.active_filters_in_toolbar_threshold) if (toolbar.width >= threshold) { binding.activeFiltersWideStub.viewStub?.apply { setOnInflateListener { _, inflated -> SearchActiveFiltersWideBinding.bind(inflated).apply { viewModel = this@SearchFragment.viewModel lifecycleOwner = viewLifecycleOwner } } inflate() } } else { binding.activeFiltersNarrowStub.viewStub?.apply { setOnInflateListener { _, inflated -> SearchActiveFiltersNarrowBinding.bind(inflated).apply { viewModel = this@SearchFragment.viewModel lifecycleOwner = viewLifecycleOwner } } inflate() } } } if (savedInstanceState == null) { // On first entry, show the filters. findFiltersFragment().showFiltersSheet() } analyticsHelper.sendScreenView("Search", requireActivity()) } override fun onPause() { dismissKeyboard(binding.searchView) super.onPause() } private fun showKeyboard(view: View) { ViewCompat.getWindowInsetsController(view)?.show(WindowInsetsCompat.Type.ime()) } private fun dismissKeyboard(view: View) { ViewCompat.getWindowInsetsController(view)?.hide(WindowInsetsCompat.Type.ime()) } private fun findFiltersFragment(): SearchFilterFragment { return childFragmentManager.findFragmentById(R.id.filter_sheet) as SearchFilterFragment } } ================================================ FILE: mobile/src/main/java/com/google/samples/apps/iosched/ui/search/SearchViewModel.kt ================================================ /* * Copyright 2019 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.ui.search import androidx.core.os.trace import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.google.samples.apps.iosched.model.userdata.UserSession import com.google.samples.apps.iosched.shared.analytics.AnalyticsActions import com.google.samples.apps.iosched.shared.analytics.AnalyticsHelper import com.google.samples.apps.iosched.shared.domain.search.LoadSearchFiltersUseCase import com.google.samples.apps.iosched.shared.domain.search.SessionSearchUseCase import com.google.samples.apps.iosched.shared.domain.search.SessionSearchUseCaseParams import com.google.samples.apps.iosched.shared.domain.settings.GetTimeZoneUseCase import com.google.samples.apps.iosched.shared.result.Result import com.google.samples.apps.iosched.shared.result.Result.Loading import com.google.samples.apps.iosched.shared.result.successOr import com.google.samples.apps.iosched.shared.util.TimeUtils import com.google.samples.apps.iosched.ui.filters.FiltersViewModelDelegate import com.google.samples.apps.iosched.ui.signin.SignInViewModelDelegate import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.Job import kotlinx.coroutines.delay import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.collect import kotlinx.coroutines.flow.flow import kotlinx.coroutines.flow.stateIn import kotlinx.coroutines.launch import org.threeten.bp.ZoneId import javax.inject.Inject @HiltViewModel class SearchViewModel @Inject constructor( private val analyticsHelper: AnalyticsHelper, private val searchUseCase: SessionSearchUseCase, getTimeZoneUseCase: GetTimeZoneUseCase, loadFiltersUseCase: LoadSearchFiltersUseCase, signInViewModelDelegate: SignInViewModelDelegate, filtersViewModelDelegate: FiltersViewModelDelegate ) : ViewModel(), SignInViewModelDelegate by signInViewModelDelegate, FiltersViewModelDelegate by filtersViewModelDelegate { private val _searchResults = MutableStateFlow>(emptyList()) val searchResults: StateFlow> = _searchResults private val _isEmpty = MutableStateFlow(true) val isEmpty: StateFlow = _isEmpty private var searchJob: Job? = null val timeZoneId: StateFlow = flow { if (getTimeZoneUseCase(Unit).successOr(true)) { emit(TimeUtils.CONFERENCE_TIMEZONE) } else { emit(ZoneId.systemDefault()) } }.stateIn(viewModelScope, SharingStarted.Lazily, ZoneId.systemDefault()) private var textQuery = "" // Override because we also want to show result count when there's a text query. private val _showResultCount = MutableStateFlow(false) override val showResultCount: StateFlow = _showResultCount init { // Load filters viewModelScope.launch { setSupportedFilters(loadFiltersUseCase(Unit).successOr(emptyList())) } // Re-execute search when selected filters change viewModelScope.launch { selectedFilters.collect { executeSearch() } } // Re-execute search when signed in user changes. // Required because we show star / reservation status. viewModelScope.launch { userInfo.collect { executeSearch() } } } fun onSearchQueryChanged(query: String) { val newQuery = query.trim().takeIf { it.length >= 2 } ?: "" if (textQuery != newQuery) { textQuery = newQuery analyticsHelper.logUiEvent("Query: $newQuery", AnalyticsActions.SEARCH_QUERY_SUBMIT) executeSearch() } } private fun executeSearch() { // Cancel any in-flight searches searchJob?.cancel() val filters = selectedFilters.value if (textQuery.isEmpty() && filters.isEmpty()) { clearSearchResults() return } searchJob = viewModelScope.launch { // The user could be typing or toggling filters rapidly. Giving the search job // a slight delay and cancelling it on each call to this method effectively debounces. delay(500) trace("search-path-viewmodel") { searchUseCase( SessionSearchUseCaseParams(userIdValue, textQuery, filters) ).collect { processSearchResult(it) } } } } private fun clearSearchResults() { _searchResults.value = emptyList() // Explicitly set false to not show the "No results" state _isEmpty.value = false _showResultCount.value = false resultCount.value = 0 } private fun processSearchResult(searchResult: Result>) { if (searchResult is Loading) { return // avoids UI flickering } val sessions = searchResult.successOr(emptyList()) _searchResults.value = sessions _isEmpty.value = sessions.isEmpty() _showResultCount.value = true resultCount.value = sessions.size } } ================================================ FILE: mobile/src/main/java/com/google/samples/apps/iosched/ui/sessioncommon/EventActions.kt ================================================ /* * Copyright 2018 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.ui.sessioncommon import com.google.samples.apps.iosched.model.SessionId import com.google.samples.apps.iosched.model.userdata.UserSession /** * Actions that can be performed on events. */ interface OnSessionClickListener { fun openEventDetail(id: SessionId) } interface OnSessionStarClickListener { fun onStarClicked(userSession: UserSession) } ================================================ FILE: mobile/src/main/java/com/google/samples/apps/iosched/ui/sessioncommon/OnSessionStarClickDelegate.kt ================================================ /* * Copyright 2018 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.ui.sessioncommon import com.google.samples.apps.iosched.R import com.google.samples.apps.iosched.model.userdata.UserSession import com.google.samples.apps.iosched.shared.analytics.AnalyticsActions import com.google.samples.apps.iosched.shared.analytics.AnalyticsHelper import com.google.samples.apps.iosched.shared.di.ApplicationScope import com.google.samples.apps.iosched.shared.di.MainDispatcher import com.google.samples.apps.iosched.shared.domain.users.StarEventAndNotifyUseCase import com.google.samples.apps.iosched.shared.domain.users.StarEventParameter import com.google.samples.apps.iosched.shared.result.Result import com.google.samples.apps.iosched.shared.util.tryOffer import com.google.samples.apps.iosched.ui.messages.SnackbarMessage import com.google.samples.apps.iosched.ui.messages.SnackbarMessageManager import com.google.samples.apps.iosched.ui.signin.SignInViewModelDelegate import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.channels.Channel import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.receiveAsFlow import kotlinx.coroutines.launch import timber.log.Timber import java.util.UUID import javax.inject.Inject /** * A delegate providing common functionality for starring events. */ interface OnSessionStarClickDelegate : OnSessionStarClickListener { val navigateToSignInDialogEvents: Flow } class DefaultOnSessionStarClickDelegate @Inject constructor( signInViewModelDelegate: SignInViewModelDelegate, private val starEventUseCase: StarEventAndNotifyUseCase, private val snackbarMessageManager: SnackbarMessageManager, private val analyticsHelper: AnalyticsHelper, @ApplicationScope private val externalScope: CoroutineScope, @MainDispatcher private val mainDispatcher: CoroutineDispatcher ) : OnSessionStarClickDelegate, SignInViewModelDelegate by signInViewModelDelegate { private val _navigateToSignInDialogEvents = Channel(capacity = Channel.CONFLATED) override val navigateToSignInDialogEvents = _navigateToSignInDialogEvents.receiveAsFlow() override fun onStarClicked(userSession: UserSession) { if (!isUserSignedInValue) { Timber.d("Showing Sign-in dialog after star click") _navigateToSignInDialogEvents.tryOffer(Unit) return } val newIsStarredState = !userSession.userEvent.isStarred // Update the snackbar message optimistically. val stringResId = if (newIsStarredState) { R.string.event_starred } else { R.string.event_unstarred } snackbarMessageManager.addMessage( SnackbarMessage( messageId = stringResId, actionId = R.string.dont_show, requestChangeId = UUID.randomUUID().toString() ) ) if (newIsStarredState) { analyticsHelper.logUiEvent(userSession.session.title, AnalyticsActions.STARRED) } externalScope.launch(mainDispatcher) { userIdValue?.let { val result = starEventUseCase( StarEventParameter( it, userSession.copy( userEvent = userSession.userEvent.copy(isStarred = newIsStarredState) ) ) ) // Show an error message if a star request fails if (result is Result.Error) { snackbarMessageManager.addMessage(SnackbarMessage(R.string.event_star_error)) } } } } } ================================================ FILE: mobile/src/main/java/com/google/samples/apps/iosched/ui/sessioncommon/OnSessionStarClickDelegateModule.kt ================================================ /* * Copyright 2018 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.ui.sessioncommon import com.google.samples.apps.iosched.shared.analytics.AnalyticsHelper import com.google.samples.apps.iosched.shared.di.ApplicationScope import com.google.samples.apps.iosched.shared.di.MainDispatcher import com.google.samples.apps.iosched.shared.domain.users.StarEventAndNotifyUseCase import com.google.samples.apps.iosched.ui.messages.SnackbarMessageManager import com.google.samples.apps.iosched.ui.signin.SignInViewModelDelegate import dagger.Module import dagger.Provides import dagger.hilt.InstallIn import dagger.hilt.android.components.ViewModelComponent import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.CoroutineScope /** * Provides a default implementation of [OnSessionStarClickDelegate]. */ @InstallIn(ViewModelComponent::class) @Module internal class OnSessionStarClickDelegateModule { @Provides fun provideOnSessionStarClickDelegate( signInViewModelDelegate: SignInViewModelDelegate, starEventUseCase: StarEventAndNotifyUseCase, snackbarMessageManager: SnackbarMessageManager, analyticsHelper: AnalyticsHelper, @ApplicationScope applicationScope: CoroutineScope, @MainDispatcher mainDispatcher: CoroutineDispatcher ): OnSessionStarClickDelegate { return DefaultOnSessionStarClickDelegate( signInViewModelDelegate, starEventUseCase, snackbarMessageManager, analyticsHelper, applicationScope, mainDispatcher ) } } ================================================ FILE: mobile/src/main/java/com/google/samples/apps/iosched/ui/sessioncommon/SessionCommonExtensions.kt ================================================ /* * Copyright 2018 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.ui.sessioncommon import com.google.samples.apps.iosched.R import com.google.samples.apps.iosched.shared.data.userevent.UserEventMessageChangeType import com.google.samples.apps.iosched.shared.data.userevent.UserEventMessageChangeType.CANCELLATION_DENIED_CUTOFF import com.google.samples.apps.iosched.shared.data.userevent.UserEventMessageChangeType.CANCELLATION_DENIED_UNKNOWN import com.google.samples.apps.iosched.shared.data.userevent.UserEventMessageChangeType.CHANGES_IN_RESERVATIONS import com.google.samples.apps.iosched.shared.data.userevent.UserEventMessageChangeType.CHANGES_IN_WAITLIST import com.google.samples.apps.iosched.shared.data.userevent.UserEventMessageChangeType.RESERVATIONS_REPLACED import com.google.samples.apps.iosched.shared.data.userevent.UserEventMessageChangeType.RESERVATION_CANCELED import com.google.samples.apps.iosched.shared.data.userevent.UserEventMessageChangeType.RESERVATION_DENIED_CLASH import com.google.samples.apps.iosched.shared.data.userevent.UserEventMessageChangeType.RESERVATION_DENIED_CUTOFF import com.google.samples.apps.iosched.shared.data.userevent.UserEventMessageChangeType.RESERVATION_DENIED_UNKNOWN import com.google.samples.apps.iosched.shared.data.userevent.UserEventMessageChangeType.WAITLIST_CANCELED fun UserEventMessageChangeType.stringRes(): Int { return when (this) { CHANGES_IN_RESERVATIONS -> R.string.reservation_new RESERVATIONS_REPLACED -> R.string.reservation_replaced CHANGES_IN_WAITLIST -> R.string.waitlist_new RESERVATION_CANCELED -> R.string.reservation_cancel_succeeded WAITLIST_CANCELED -> R.string.waitlist_cancel_succeeded RESERVATION_DENIED_CUTOFF -> R.string.reservation_denied_cutoff RESERVATION_DENIED_CLASH -> R.string.reservation_denied_clash RESERVATION_DENIED_UNKNOWN -> R.string.reservation_denied_unknown CANCELLATION_DENIED_CUTOFF -> R.string.cancellation_denied_cutoff CANCELLATION_DENIED_UNKNOWN -> R.string.cancellation_denied_unknown } } ================================================ FILE: mobile/src/main/java/com/google/samples/apps/iosched/ui/sessioncommon/SessionViewPoolModule.kt ================================================ /* * Copyright 2018 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.ui.sessioncommon import androidx.recyclerview.widget.RecyclerView import dagger.Module import dagger.Provides import dagger.hilt.InstallIn import dagger.hilt.android.components.FragmentComponent import dagger.hilt.android.scopes.FragmentScoped import javax.inject.Named /** * Provides [RecyclerView.RecycledViewPool]s to share views between [RecyclerView]s. * E.g. Between different days of the schedule. */ @InstallIn(FragmentComponent::class) @Module internal class SessionViewPoolModule { @FragmentScoped @Provides @Named("sessionViewPool") fun providesSessionViewPool(): RecyclerView.RecycledViewPool = RecyclerView.RecycledViewPool() @FragmentScoped @Provides @Named("tagViewPool") fun providesTagViewPool(): RecyclerView.RecycledViewPool = RecyclerView.RecycledViewPool() } ================================================ FILE: mobile/src/main/java/com/google/samples/apps/iosched/ui/sessioncommon/SessionsAdapter.kt ================================================ /* * Copyright 2020 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.ui.sessioncommon import android.view.LayoutInflater import android.view.ViewGroup import androidx.lifecycle.LifecycleOwner import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.ListAdapter import androidx.recyclerview.widget.RecyclerView.RecycledViewPool import androidx.recyclerview.widget.RecyclerView.ViewHolder import com.google.android.flexbox.FlexboxLayoutManager import com.google.samples.apps.iosched.databinding.ItemSessionBinding import com.google.samples.apps.iosched.model.userdata.UserSession import kotlinx.coroutines.flow.StateFlow import org.threeten.bp.ZoneId class SessionsAdapter( private val tagViewPool: RecycledViewPool, private val showReservations: StateFlow, private val timeZoneId: StateFlow, private val lifecycleOwner: LifecycleOwner, private val onSessionClickListener: OnSessionClickListener, private val onSessionStarClickListener: OnSessionStarClickListener ) : ListAdapter(SessionDiff) { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): SessionViewHolder { val binding = ItemSessionBinding.inflate( LayoutInflater.from(parent.context), parent, false ).apply { tags.apply { setRecycledViewPool(tagViewPool) layoutManager = FlexboxLayoutManager(parent.context).apply { recycleChildrenOnDetach = true } } showReservations = this@SessionsAdapter.showReservations timeZoneId = this@SessionsAdapter.timeZoneId showTime = false lifecycleOwner = this@SessionsAdapter.lifecycleOwner sessionClickListener = onSessionClickListener sessionStarClickListener = onSessionStarClickListener } return SessionViewHolder(binding) } override fun onBindViewHolder(holder: SessionViewHolder, position: Int) { holder.binding.userSession = getItem(position) holder.binding.executePendingBindings() } } class SessionViewHolder( internal val binding: ItemSessionBinding ) : ViewHolder(binding.root) object SessionDiff : DiffUtil.ItemCallback() { override fun areItemsTheSame(oldItem: UserSession, newItem: UserSession): Boolean { // We don't have to compare the userEvent id because it matches the session id. return oldItem.session.id == newItem.session.id } override fun areContentsTheSame(oldItem: UserSession, newItem: UserSession): Boolean { return oldItem == newItem } } ================================================ FILE: mobile/src/main/java/com/google/samples/apps/iosched/ui/sessioncommon/TagAdapter.kt ================================================ /* * Copyright 2018 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.ui.sessioncommon import android.view.LayoutInflater import android.view.ViewGroup import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView.ViewHolder import com.google.samples.apps.iosched.databinding.ItemInlineTagBinding import com.google.samples.apps.iosched.model.Tag class TagAdapter : RecyclerView.Adapter() { var tags = emptyList() override fun getItemCount() = tags.size override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): TagViewHolder { return TagViewHolder( ItemInlineTagBinding.inflate(LayoutInflater.from(parent.context), parent, false) ) } override fun onBindViewHolder(holder: TagViewHolder, position: Int) { holder.bind(tags[position]) } } class TagViewHolder(private val binding: ItemInlineTagBinding) : ViewHolder(binding.root) { fun bind(tag: Tag) { binding.tag = tag binding.executePendingBindings() } } ================================================ FILE: mobile/src/main/java/com/google/samples/apps/iosched/ui/sessioncommon/TagBindingAdapters.kt ================================================ /* * Copyright 2018 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.ui.sessioncommon import android.content.Context import android.graphics.Color.TRANSPARENT import android.graphics.drawable.GradientDrawable import android.widget.TextView import androidx.core.content.ContextCompat import androidx.core.view.isGone import androidx.core.view.isVisible import androidx.databinding.BindingAdapter import androidx.recyclerview.widget.RecyclerView import com.google.samples.apps.iosched.R import com.google.samples.apps.iosched.model.Tag @BindingAdapter("topicTags") fun topicTags(recyclerView: RecyclerView, topicTags: List?) { if (topicTags?.isNotEmpty() == true) { recyclerView.isVisible = true recyclerView.adapter = (recyclerView.adapter as? TagAdapter ?: TagAdapter()) .apply { tags = topicTags } } else { recyclerView.isGone = true } } @BindingAdapter("tagTint") fun tagTint(textView: TextView, color: Int) { // Tint the colored dot (textView.compoundDrawablesRelative[0] as? GradientDrawable)?.setColor( tagTintOrDefault( color, textView.context ) ) } fun tagTintOrDefault(color: Int, context: Context): Int { return if (color != TRANSPARENT) { color } else { ContextCompat.getColor(context, R.color.default_tag_color) } } ================================================ FILE: mobile/src/main/java/com/google/samples/apps/iosched/ui/sessiondetail/SessionDetailAdapter.kt ================================================ /* * Copyright 2018 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.ui.sessiondetail import android.annotation.SuppressLint import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.lifecycle.LifecycleOwner import androidx.recyclerview.widget.AsyncListDiffer import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView.RecycledViewPool import com.google.samples.apps.iosched.R import com.google.samples.apps.iosched.databinding.ItemGenericSectionHeaderBinding import com.google.samples.apps.iosched.databinding.ItemSessionBinding import com.google.samples.apps.iosched.databinding.ItemSessionInfoBinding import com.google.samples.apps.iosched.databinding.ItemSpeakerBinding import com.google.samples.apps.iosched.model.Speaker import com.google.samples.apps.iosched.model.userdata.UserSession import com.google.samples.apps.iosched.ui.SectionHeader import com.google.samples.apps.iosched.ui.sessioncommon.OnSessionClickListener import com.google.samples.apps.iosched.ui.sessiondetail.SessionDetailViewHolder.HeaderViewHolder import com.google.samples.apps.iosched.ui.sessiondetail.SessionDetailViewHolder.RelatedViewHolder import com.google.samples.apps.iosched.ui.sessiondetail.SessionDetailViewHolder.SessionInfoViewHolder import com.google.samples.apps.iosched.ui.sessiondetail.SessionDetailViewHolder.SpeakerViewHolder import com.google.samples.apps.iosched.util.executeAfter /** * [RecyclerView.Adapter] for presenting a session details, composed of information about the * session, any speakers plus any related events. */ class SessionDetailAdapter( private val lifecycleOwner: LifecycleOwner, private val sessionDetailViewModel: SessionDetailViewModel, private val onSessionClickListener: OnSessionClickListener, private val tagRecycledViewPool: RecycledViewPool ) : RecyclerView.Adapter() { private val differ = AsyncListDiffer(this, DiffCallback) var speakers: List = emptyList() set(value) { field = value differ.submitList(buildMergedList(sessionSpeakers = value)) } var related: List = emptyList() set(value) { field = value differ.submitList(buildMergedList(relatedSessions = value)) } init { differ.submitList(buildMergedList()) } override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): SessionDetailViewHolder { val inflater = LayoutInflater.from(parent.context) return when (viewType) { R.layout.item_session_info -> SessionInfoViewHolder( ItemSessionInfoBinding.inflate(inflater, parent, false) ) R.layout.item_speaker -> SpeakerViewHolder( ItemSpeakerBinding.inflate(inflater, parent, false) ) R.layout.item_session -> RelatedViewHolder( ItemSessionBinding.inflate(inflater, parent, false).apply { tags.setRecycledViewPool(tagRecycledViewPool) } ) R.layout.item_generic_section_header -> HeaderViewHolder( ItemGenericSectionHeaderBinding.inflate(inflater, parent, false) ) else -> throw IllegalStateException("Unknown viewType $viewType") } } override fun onBindViewHolder(holder: SessionDetailViewHolder, position: Int) { when (holder) { is SessionInfoViewHolder -> holder.binding.executeAfter { viewModel = sessionDetailViewModel tagViewPool = tagRecycledViewPool lifecycleOwner = this@SessionDetailAdapter.lifecycleOwner } is SpeakerViewHolder -> holder.binding.executeAfter { val presenter = differ.currentList[position] as Speaker speaker = presenter eventListener = sessionDetailViewModel lifecycleOwner = this@SessionDetailAdapter.lifecycleOwner root.setTag(R.id.tag_speaker_id, presenter.id) // Used to identify clicked view } is RelatedViewHolder -> holder.binding.executeAfter { userSession = differ.currentList[position] as UserSession sessionClickListener = onSessionClickListener sessionStarClickListener = sessionDetailViewModel timeZoneId = sessionDetailViewModel.timeZoneId showTime = true lifecycleOwner = this@SessionDetailAdapter.lifecycleOwner } is HeaderViewHolder -> holder.binding.executeAfter { sectionHeader = differ.currentList[position] as SectionHeader } } } override fun getItemViewType(position: Int): Int { return when (differ.currentList[position]) { is SessionItem -> R.layout.item_session_info is Speaker -> R.layout.item_speaker is UserSession -> R.layout.item_session is SectionHeader -> R.layout.item_generic_section_header else -> throw IllegalStateException("Unknown view type at position $position") } } override fun getItemCount() = differ.currentList.size /** * This adapter displays heterogeneous data types but `RecyclerView` & `AsyncListDiffer` deal in * a single list of items. We therefore combine them into a merged list, using marker objects * for static items. We still hold separate lists of [speakers] and [related] sessions so that * we can provide them individually, as they're loaded. */ private fun buildMergedList( sessionSpeakers: List = speakers, relatedSessions: List = related ): List { val merged = mutableListOf(SessionItem) if (sessionSpeakers.isNotEmpty()) { merged += SectionHeader(R.string.session_detail_speakers_header) merged.addAll(sessionSpeakers) } if (relatedSessions.isNotEmpty()) { merged += SectionHeader(R.string.session_detail_related_header) merged.addAll(relatedSessions) } return merged } } // Marker object for use in our merged representation. object SessionItem /** * Diff items presented by this adapter. */ object DiffCallback : DiffUtil.ItemCallback() { override fun areItemsTheSame(oldItem: Any, newItem: Any): Boolean { return when { oldItem === SessionItem && newItem === SessionItem -> true oldItem is SectionHeader && newItem is SectionHeader -> oldItem == newItem oldItem is Speaker && newItem is Speaker -> oldItem.id == newItem.id oldItem is UserSession && newItem is UserSession -> oldItem.session.id == newItem.session.id else -> false } } @SuppressLint("DiffUtilEquals") // Workaround of https://issuetracker.google.com/issues/122928037 override fun areContentsTheSame(oldItem: Any, newItem: Any): Boolean { return when { oldItem is Speaker && newItem is Speaker -> oldItem == newItem oldItem is UserSession && newItem is UserSession -> oldItem == newItem else -> true } } } /** * [RecyclerView.ViewHolder] types used by this adapter. */ sealed class SessionDetailViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { class SessionInfoViewHolder( val binding: ItemSessionInfoBinding ) : SessionDetailViewHolder(binding.root) class SpeakerViewHolder( val binding: ItemSpeakerBinding ) : SessionDetailViewHolder(binding.root) class RelatedViewHolder( val binding: ItemSessionBinding ) : SessionDetailViewHolder(binding.root) class HeaderViewHolder( val binding: ItemGenericSectionHeaderBinding ) : SessionDetailViewHolder(binding.root) } ================================================ FILE: mobile/src/main/java/com/google/samples/apps/iosched/ui/sessiondetail/SessionDetailDataBindingAdapters.kt ================================================ /* * Copyright 2018 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.ui.sessiondetail import android.view.View.GONE import android.view.View.VISIBLE import android.widget.ImageView import android.widget.TextView import androidx.databinding.BindingAdapter import com.bumptech.glide.Glide import com.bumptech.glide.request.RequestOptions import com.google.samples.apps.iosched.R import com.google.samples.apps.iosched.model.Session import com.google.samples.apps.iosched.model.SessionType.AFTER_DARK import com.google.samples.apps.iosched.model.SessionType.APP_REVIEW import com.google.samples.apps.iosched.model.SessionType.GAME_REVIEW import com.google.samples.apps.iosched.model.SessionType.KEYNOTE import com.google.samples.apps.iosched.model.SessionType.OFFICE_HOURS import com.google.samples.apps.iosched.model.SessionType.SESSION import com.google.samples.apps.iosched.model.userdata.UserSession import com.google.samples.apps.iosched.shared.util.TimeUtils import com.google.samples.apps.iosched.ui.reservation.ReservationViewState import com.google.samples.apps.iosched.ui.reservation.ReservationViewState.RESERVABLE import com.google.samples.apps.iosched.ui.reservation.StarReserveFab import org.threeten.bp.Duration import org.threeten.bp.ZoneId import org.threeten.bp.ZonedDateTime /* Narrow headers used for events that have neither a photo nor video url. */ @BindingAdapter("eventNarrowHeader") fun eventNarrowHeaderImage(imageView: ImageView, session: Session?) { session ?: return val resId = when (session.type) { KEYNOTE -> R.drawable.event_narrow_keynote // For the next few types, we choose a random image, but we should use the same image for a // given event, so use the id to pick. SESSION -> when (session.id.hashCode() % 4) { 0 -> R.drawable.event_narrow_session1 1 -> R.drawable.event_narrow_session2 2 -> R.drawable.event_narrow_session3 else -> R.drawable.event_narrow_session4 } OFFICE_HOURS -> when (session.id.hashCode() % 3) { 0 -> R.drawable.event_narrow_office_hours1 1 -> R.drawable.event_narrow_office_hours2 else -> R.drawable.event_narrow_office_hours3 } APP_REVIEW -> when (session.id.hashCode() % 3) { 0 -> R.drawable.event_narrow_app_reviews1 1 -> R.drawable.event_narrow_app_reviews2 else -> R.drawable.event_narrow_app_reviews3 } GAME_REVIEW -> when (session.id.hashCode() % 3) { 0 -> R.drawable.event_narrow_game_reviews1 1 -> R.drawable.event_narrow_game_reviews2 else -> R.drawable.event_narrow_game_reviews3 } AFTER_DARK -> R.drawable.event_narrow_afterhours else -> R.drawable.event_narrow_other } imageView.setImageResource(resId) } /* Photos are used if the event has a photo and/or a video url. */ @BindingAdapter("eventPhoto") fun eventPhoto(imageView: ImageView, session: Session?) { session ?: return val resId = when (session.type) { KEYNOTE -> R.drawable.event_placeholder_keynote // Choose a random image, but we should use the same image for a given session, so use ID to // pick. SESSION -> when (session.id.hashCode() % 4) { 0 -> R.drawable.event_placeholder_session1 1 -> R.drawable.event_placeholder_session2 2 -> R.drawable.event_placeholder_session3 else -> R.drawable.event_placeholder_session4 } // Other event types probably won't have photos or video, but just in case... else -> R.drawable.event_placeholder_keynote } if (session.hasPhoto) { Glide.with(imageView) .load(session.photoUrl) .apply(RequestOptions().placeholder(resId)) .into(imageView) } else { imageView.setImageResource(resId) } } @BindingAdapter( value = ["sessionDetailStartTime", "sessionDetailEndTime", "timeZoneId"], requireAll = true ) fun timeString( view: TextView, sessionDetailStartTime: ZonedDateTime?, sessionDetailEndTime: ZonedDateTime?, timeZoneId: ZoneId? ) { if (sessionDetailStartTime == null || sessionDetailEndTime == null || timeZoneId == null) { view.text = "" } else { view.text = TimeUtils.timeString( TimeUtils.zonedTime(sessionDetailStartTime, timeZoneId), TimeUtils.zonedTime(sessionDetailEndTime, timeZoneId) ) } } @BindingAdapter("sessionStartCountdown") fun sessionStartCountdown(view: TextView, timeUntilStart: Duration?) { if (timeUntilStart == null) { view.visibility = GONE } else { view.visibility = VISIBLE val minutes = timeUntilStart.toMinutes() view.text = view.context.resources.getQuantityString( R.plurals.session_starting_in, minutes.toInt(), minutes.toString() ) } } @BindingAdapter( "userSession", "isSignedIn", "isRegistered", "isReservable", "isReservationDeniedByCutoff", "eventListener", requireAll = true ) fun assignFab( fab: StarReserveFab, userSession: UserSession?, isSignedIn: Boolean, isRegistered: Boolean, isReservable: Boolean, isReservationDeniedByCutoff: Boolean, eventListener: SessionDetailEventListener ) { userSession ?: return when { !isSignedIn -> { if (isReservable) { fab.reservationStatus = RESERVABLE } else { fab.isChecked = false } fab.setOnClickListener { eventListener.onLoginClicked() } } isRegistered && isReservable -> { fab.reservationStatus = ReservationViewState.fromUserEvent( userSession.userEvent, isReservationDeniedByCutoff ) fab.setOnClickListener { eventListener.onReservationClicked() } } else -> { fab.isChecked = userSession.userEvent.isStarred fab.setOnClickListener { eventListener.onStarClicked(userSession) } } } } ================================================ FILE: mobile/src/main/java/com/google/samples/apps/iosched/ui/sessiondetail/SessionDetailFragment.kt ================================================ /* * Copyright 2018 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.ui.sessiondetail import android.content.Intent import android.os.Bundle import android.provider.CalendarContract import android.view.ContextThemeWrapper import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.appcompat.content.res.AppCompatResources import androidx.core.app.ShareCompat import androidx.core.net.toUri import androidx.core.view.WindowInsetsCompat import androidx.core.view.doOnLayout import androidx.core.view.doOnNextLayout import androidx.core.view.forEach import androidx.core.view.updatePadding import androidx.fragment.app.Fragment import androidx.fragment.app.FragmentActivity import androidx.fragment.app.activityViewModels import androidx.fragment.app.viewModels import androidx.navigation.fragment.FragmentNavigatorExtras import androidx.navigation.fragment.findNavController import androidx.recyclerview.widget.RecyclerView.RecycledViewPool import androidx.transition.TransitionInflater import com.google.samples.apps.iosched.R import com.google.samples.apps.iosched.R.style import com.google.samples.apps.iosched.databinding.FragmentSessionDetailBinding import com.google.samples.apps.iosched.model.Session import com.google.samples.apps.iosched.model.SpeakerId import com.google.samples.apps.iosched.shared.analytics.AnalyticsActions import com.google.samples.apps.iosched.shared.analytics.AnalyticsHelper import com.google.samples.apps.iosched.shared.di.MapFeatureEnabledFlag import com.google.samples.apps.iosched.shared.domain.users.SwapRequestParameters import com.google.samples.apps.iosched.shared.notifications.AlarmBroadcastReceiver import com.google.samples.apps.iosched.shared.result.successOr import com.google.samples.apps.iosched.shared.util.toEpochMilli import com.google.samples.apps.iosched.ui.messages.SnackbarMessageManager import com.google.samples.apps.iosched.ui.reservation.RemoveReservationDialogFragment import com.google.samples.apps.iosched.ui.reservation.RemoveReservationDialogFragment.Companion.DIALOG_REMOVE_RESERVATION import com.google.samples.apps.iosched.ui.reservation.RemoveReservationDialogParameters import com.google.samples.apps.iosched.ui.reservation.SwapReservationDialogFragment import com.google.samples.apps.iosched.ui.reservation.SwapReservationDialogFragment.Companion.DIALOG_SWAP_RESERVATION import com.google.samples.apps.iosched.ui.schedule.ScheduleTwoPaneViewModel import com.google.samples.apps.iosched.ui.sessiondetail.SessionDetailNavigationAction.NavigateToSessionFeedback import com.google.samples.apps.iosched.ui.sessiondetail.SessionDetailNavigationAction.NavigateToSignInDialogAction import com.google.samples.apps.iosched.ui.sessiondetail.SessionDetailNavigationAction.NavigateToSpeakerDetail import com.google.samples.apps.iosched.ui.sessiondetail.SessionDetailNavigationAction.NavigateToSwapReservationDialogAction import com.google.samples.apps.iosched.ui.sessiondetail.SessionDetailNavigationAction.NavigateToYoutube import com.google.samples.apps.iosched.ui.sessiondetail.SessionDetailNavigationAction.RemoveReservationDialogAction import com.google.samples.apps.iosched.ui.sessiondetail.SessionDetailNavigationAction.ShowNotificationsPrefAction import com.google.samples.apps.iosched.ui.signin.NotificationsPreferenceDialogFragment import com.google.samples.apps.iosched.ui.signin.NotificationsPreferenceDialogFragment.Companion.DIALOG_NOTIFICATIONS_PREFERENCE import com.google.samples.apps.iosched.ui.signin.SignInDialogFragment import com.google.samples.apps.iosched.ui.signin.SignInDialogFragment.Companion.DIALOG_SIGN_IN import com.google.samples.apps.iosched.util.doOnApplyWindowInsets import com.google.samples.apps.iosched.util.launchAndRepeatWithViewLifecycle import com.google.samples.apps.iosched.util.openWebsiteUrl import com.google.samples.apps.iosched.util.setContentMaxWidth import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.collect import kotlinx.coroutines.launch import timber.log.Timber import java.util.concurrent.TimeUnit import javax.inject.Inject import javax.inject.Named @AndroidEntryPoint class SessionDetailFragment : Fragment(), SessionFeedbackFragment.Listener { private var shareString = "" @Inject lateinit var snackbarMessageManager: SnackbarMessageManager private val sessionDetailViewModel: SessionDetailViewModel by viewModels() private val scheduleTwoPaneViewModel: ScheduleTwoPaneViewModel by activityViewModels() @Inject lateinit var analyticsHelper: AnalyticsHelper @Inject @Named("tagViewPool") lateinit var tagRecycledViewPool: RecycledViewPool @Inject @JvmField @MapFeatureEnabledFlag var isMapEnabled: Boolean = false private var session: Session? = null private lateinit var sessionTitle: String private lateinit var binding: FragmentSessionDetailBinding override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View { sharedElementReturnTransition = TransitionInflater.from(requireContext()) .inflateTransition(R.transition.speaker_shared_enter) // Delay the enter transition until speaker image has loaded. postponeEnterTransition(500L, TimeUnit.MILLISECONDS) val themedInflater = inflater.cloneInContext(ContextThemeWrapper(requireActivity(), style.AppTheme_Detail)) binding = FragmentSessionDetailBinding.inflate(themedInflater, container, false) return binding.root } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) binding.viewModel = sessionDetailViewModel binding.lifecycleOwner = viewLifecycleOwner binding.sessionDetailBottomAppBar.run { inflateMenu(R.menu.session_detail_menu) menu.findItem(R.id.menu_item_map)?.isVisible = isMapEnabled setOnMenuItemClickListener { item -> when (item.itemId) { R.id.menu_item_share -> { ShareCompat.IntentBuilder.from(requireActivity()) .setType("text/plain") .setText(shareString) .setChooserTitle(R.string.intent_chooser_session_detail) .startChooser() } R.id.menu_item_star -> { sessionDetailViewModel.userSession.value?.let( scheduleTwoPaneViewModel::onStarClicked ) } R.id.menu_item_map -> { // TODO support opening Map } R.id.menu_item_ask_question -> { sessionDetailViewModel.session.value?.let { session -> openWebsiteUrl(requireContext(), session.doryLink) } } R.id.menu_item_calendar -> { sessionDetailViewModel.session.value?.let(::addToCalendar) } } true } } val detailsAdapter = SessionDetailAdapter( viewLifecycleOwner, sessionDetailViewModel, scheduleTwoPaneViewModel, tagRecycledViewPool ) binding.sessionDetailRecyclerView.run { adapter = detailsAdapter itemAnimator?.run { addDuration = 120L moveDuration = 120L changeDuration = 120L removeDuration = 100L } doOnApplyWindowInsets { view, insets, padding -> val systemInsets = insets.getInsets( WindowInsetsCompat.Type.systemBars() or WindowInsetsCompat.Type.ime() ) view.updatePadding(bottom = padding.bottom + systemInsets.bottom) // CollapsingToolbarLayout's default scrim visible trigger height is a bit large. // Choose something smaller so that the content stays visible longer. binding.collapsingToolbar.scrimVisibleHeightTrigger = systemInsets.top * 2 } doOnNextLayout { setContentMaxWidth(this) } } launchAndRepeatWithViewLifecycle { observeViewModel() } } private fun CoroutineScope.observeViewModel() { val menu = binding.sessionDetailBottomAppBar.menu val starMenu = menu.findItem(R.id.menu_item_star) launch { sessionDetailViewModel.shouldShowStarInBottomNav.collect { showStar -> starMenu.isVisible = showStar } } launch { sessionDetailViewModel.userEvent.collect { userEvent -> userEvent?.let { if (it.isStarred) { starMenu.setIcon(R.drawable.ic_star) } else { starMenu.setIcon(R.drawable.ic_star_border) } } } } launch { sessionDetailViewModel.session.collect { if (it != null) { sessionTitle = it.title activity?.let { activity -> analyticsHelper.sendScreenView( "Session Details: $sessionTitle", activity ) } } } } // Navigation launch { sessionDetailViewModel.navigationActions.collect { action -> when (action) { is NavigateToSessionFeedback -> openFeedbackDialog(action.sessionId) NavigateToSignInDialogAction -> openSignInDialog(requireActivity()) is NavigateToSpeakerDetail -> { val sharedElement = findSpeakerHeadshot( binding.sessionDetailRecyclerView, action.speakerId ) findNavController().navigate( SessionDetailFragmentDirections.toSpeakerDetail(action.speakerId), FragmentNavigatorExtras( sharedElement to sharedElement.transitionName ) ) } is NavigateToSwapReservationDialogAction -> openSwapReservationDialog(requireActivity(), action.params) is NavigateToYoutube -> openYoutubeUrl(action.videoId) is RemoveReservationDialogAction -> openRemoveReservationDialog( requireActivity(), action.params ) ShowNotificationsPrefAction -> openNotificationsPreferenceDialog() } } } launch { sessionDetailViewModel.session.collect { session -> shareString = if (session == null) { "" } else { getString( R.string.share_text_session_detail, session.title, session.sessionUrl ) } (binding.sessionDetailRecyclerView.adapter as SessionDetailAdapter) .speakers = session?.speakers?.toList() ?: emptyList() // ViewBinding is binding the session so we should wait until after the session // has been laid out to report fully drawn. Note that we are *not* waiting for the // speaker images to be downloaded and displayed because we are showing a // placeholder image. Thus the screen appears fully drawn to the user. In terms of // performance, this allows us to obtain a stable start up times by not including // the network call to download images, which can vary greatly based on // uncontrollable factors, mainly network speed. binding.sessionDetailRecyclerView.doOnLayout { // If this activity was launched from a deeplink, then the logcat statement is // printed. Otherwise, SessionDetailFragment is started from the MainActivity // which would have already reported fully drawn to the framework. activity?.reportFullyDrawn() } } } launch { sessionDetailViewModel.relatedUserSessions.collect { (binding.sessionDetailRecyclerView.adapter as SessionDetailAdapter) .related = it.successOr(emptyList()) } } launch { sessionDetailViewModel.showFeedbackButton.collect { showFeedbackButton -> // When opened from the post session notification, open the feedback dialog arguments?.let { val sessionId = SessionDetailFragmentArgs.fromBundle(it).sessionId val openRateSession = arguments?.getBoolean(AlarmBroadcastReceiver.EXTRA_SHOW_RATE_SESSION_FLAG) ?: false if (showFeedbackButton && openRateSession) { openFeedbackDialog(sessionId) } } } } launch { // Only show the back/up arrow in the toolbar in single-pane configurations. scheduleTwoPaneViewModel.isTwoPane.collect { isTwoPane -> if (isTwoPane) { binding.toolbar.navigationIcon = null binding.toolbar.setNavigationOnClickListener(null) } else { binding.toolbar.navigationIcon = AppCompatResources.getDrawable(requireContext(), R.drawable.ic_arrow_back) binding.toolbar.setNavigationOnClickListener { scheduleTwoPaneViewModel.returnToListPane() } } } } launch { sessionDetailViewModel.session.collect { session -> menu.findItem(R.id.menu_item_ask_question).isVisible = session?.doryLink?.isNotBlank() == true } } } override fun onFeedbackSubmitted() { binding.snackbar.show(R.string.feedback_thank_you) } private fun openYoutubeUrl(youtubeUrl: String) { analyticsHelper.logUiEvent(sessionTitle, AnalyticsActions.YOUTUBE_LINK) startActivity(Intent(Intent.ACTION_VIEW, youtubeUrl.toUri())) } private fun openSignInDialog(activity: FragmentActivity) { SignInDialogFragment().show(activity.supportFragmentManager, DIALOG_SIGN_IN) } private fun openNotificationsPreferenceDialog() { NotificationsPreferenceDialogFragment() .show(requireActivity().supportFragmentManager, DIALOG_NOTIFICATIONS_PREFERENCE) } private fun openRemoveReservationDialog( activity: FragmentActivity, parameters: RemoveReservationDialogParameters ) { RemoveReservationDialogFragment.newInstance(parameters) .show(activity.supportFragmentManager, DIALOG_REMOVE_RESERVATION) } private fun openSwapReservationDialog( activity: FragmentActivity, parameters: SwapRequestParameters ) { SwapReservationDialogFragment.newInstance(parameters) .show(activity.supportFragmentManager, DIALOG_SWAP_RESERVATION) } private fun findSpeakerHeadshot(speakers: ViewGroup, speakerId: SpeakerId): View { speakers.forEach { if (it.getTag(R.id.tag_speaker_id) == speakerId) { return it.findViewById(R.id.speaker_item_headshot) } } Timber.e("Could not find view for speaker id $speakerId") return speakers } private fun addToCalendar(session: Session) { val intent = Intent(Intent.ACTION_INSERT) .setData(CalendarContract.Events.CONTENT_URI) .putExtra(CalendarContract.Events.TITLE, session.title) .putExtra(CalendarContract.Events.EVENT_LOCATION, session.room?.name) .putExtra( CalendarContract.Events.DESCRIPTION, session.getCalendarDescription( getString(R.string.paragraph_delimiter), getString(R.string.speaker_delimiter) ) ) .putExtra( CalendarContract.EXTRA_EVENT_BEGIN_TIME, session.startTime.toEpochMilli() ) .putExtra( CalendarContract.EXTRA_EVENT_END_TIME, session.endTime.toEpochMilli() ) if (intent.resolveActivity(requireContext().packageManager) != null) { startActivity(intent) } } private fun openFeedbackDialog(sessionId: String) { SessionFeedbackFragment.createInstance(sessionId) .show(childFragmentManager, FRAGMENT_SESSION_FEEDBACK) } companion object { private const val FRAGMENT_SESSION_FEEDBACK = "feedback" } } ================================================ FILE: mobile/src/main/java/com/google/samples/apps/iosched/ui/sessiondetail/SessionDetailNavigationAction.kt ================================================ /* * Copyright 2021 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.ui.sessiondetail import com.google.samples.apps.iosched.model.SessionId import com.google.samples.apps.iosched.model.SpeakerId import com.google.samples.apps.iosched.shared.domain.users.SwapRequestParameters import com.google.samples.apps.iosched.ui.reservation.RemoveReservationDialogParameters sealed class SessionDetailNavigationAction { object NavigateToSignInDialogAction : SessionDetailNavigationAction() object ShowNotificationsPrefAction : SessionDetailNavigationAction() class NavigateToYoutube(val videoId: String) : SessionDetailNavigationAction() class RemoveReservationDialogAction(val params: RemoveReservationDialogParameters) : SessionDetailNavigationAction() class NavigateToSwapReservationDialogAction(val params: SwapRequestParameters) : SessionDetailNavigationAction() class NavigateToSessionFeedback(val sessionId: SessionId) : SessionDetailNavigationAction() class NavigateToSpeakerDetail(val speakerId: SpeakerId) : SessionDetailNavigationAction() } ================================================ FILE: mobile/src/main/java/com/google/samples/apps/iosched/ui/sessiondetail/SessionDetailViewModel.kt ================================================ /* * Copyright 2018 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.ui.sessiondetail import androidx.lifecycle.LiveData import androidx.lifecycle.SavedStateHandle import androidx.lifecycle.ViewModel import androidx.lifecycle.asLiveData import androidx.lifecycle.viewModelScope import com.google.samples.apps.iosched.R import com.google.samples.apps.iosched.model.Session import com.google.samples.apps.iosched.model.SessionId import com.google.samples.apps.iosched.model.SessionType import com.google.samples.apps.iosched.model.SpeakerId import com.google.samples.apps.iosched.model.userdata.UserEvent import com.google.samples.apps.iosched.model.userdata.UserSession import com.google.samples.apps.iosched.shared.analytics.AnalyticsActions import com.google.samples.apps.iosched.shared.analytics.AnalyticsHelper import com.google.samples.apps.iosched.shared.di.ReservationEnabledFlag import com.google.samples.apps.iosched.shared.domain.sessions.LoadUserSessionUseCase import com.google.samples.apps.iosched.shared.domain.sessions.LoadUserSessionsUseCase import com.google.samples.apps.iosched.shared.domain.settings.GetTimeZoneUseCase import com.google.samples.apps.iosched.shared.domain.users.ReservationActionUseCase import com.google.samples.apps.iosched.shared.domain.users.ReservationRequestAction.RequestAction import com.google.samples.apps.iosched.shared.domain.users.ReservationRequestAction.SwapAction import com.google.samples.apps.iosched.shared.domain.users.ReservationRequestParameters import com.google.samples.apps.iosched.shared.result.Result import com.google.samples.apps.iosched.shared.result.Result.Error import com.google.samples.apps.iosched.shared.result.Result.Loading import com.google.samples.apps.iosched.shared.result.Result.Success import com.google.samples.apps.iosched.shared.result.data import com.google.samples.apps.iosched.shared.result.successOr import com.google.samples.apps.iosched.shared.time.TimeProvider import com.google.samples.apps.iosched.shared.util.NetworkUtils import com.google.samples.apps.iosched.shared.util.TimeUtils import com.google.samples.apps.iosched.shared.util.tryOffer import com.google.samples.apps.iosched.ui.messages.SnackbarMessage import com.google.samples.apps.iosched.ui.messages.SnackbarMessageManager import com.google.samples.apps.iosched.ui.reservation.RemoveReservationDialogParameters import com.google.samples.apps.iosched.ui.sessioncommon.OnSessionStarClickDelegate import com.google.samples.apps.iosched.ui.sessioncommon.OnSessionStarClickListener import com.google.samples.apps.iosched.ui.sessioncommon.stringRes import com.google.samples.apps.iosched.ui.sessiondetail.SessionDetailNavigationAction.NavigateToSessionFeedback import com.google.samples.apps.iosched.ui.sessiondetail.SessionDetailNavigationAction.NavigateToSignInDialogAction import com.google.samples.apps.iosched.ui.sessiondetail.SessionDetailNavigationAction.NavigateToSpeakerDetail import com.google.samples.apps.iosched.ui.sessiondetail.SessionDetailNavigationAction.NavigateToSwapReservationDialogAction import com.google.samples.apps.iosched.ui.sessiondetail.SessionDetailNavigationAction.NavigateToYoutube import com.google.samples.apps.iosched.ui.signin.SignInViewModelDelegate import com.google.samples.apps.iosched.util.WhileViewSubscribed import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.channels.Channel import kotlinx.coroutines.channels.Channel.Factory.CONFLATED import kotlinx.coroutines.delay import kotlinx.coroutines.flow.SharingStarted.Companion.Eagerly import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.combineTransform import kotlinx.coroutines.flow.emitAll import kotlinx.coroutines.flow.flow import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.mapLatest import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.flow.receiveAsFlow import kotlinx.coroutines.flow.stateIn import kotlinx.coroutines.flow.transform import kotlinx.coroutines.flow.transformLatest import kotlinx.coroutines.launch import org.threeten.bp.Duration import org.threeten.bp.ZoneId import org.threeten.bp.ZonedDateTime import timber.log.Timber import java.util.UUID import javax.inject.Inject private const val TEN_SECONDS = 10_000L private const val SIXTY_SECONDS = 60_000L /** * Loads [Session] data and exposes it to the session detail view. */ @HiltViewModel class SessionDetailViewModel @Inject constructor( savedStateHandle: SavedStateHandle, private val signInViewModelDelegate: SignInViewModelDelegate, private val loadUserSessionUseCase: LoadUserSessionUseCase, private val loadRelatedSessionUseCase: LoadUserSessionsUseCase, private val reservationActionUseCase: ReservationActionUseCase, getTimeZoneUseCase: GetTimeZoneUseCase, private val timeProvider: TimeProvider, private val networkUtils: NetworkUtils, private val analyticsHelper: AnalyticsHelper, private val snackbarMessageManager: SnackbarMessageManager, onSessionStarClickDelegate: OnSessionStarClickDelegate, @ReservationEnabledFlag val isReservationEnabledByRemoteConfig: Boolean ) : ViewModel(), SessionDetailEventListener, OnSessionStarClickListener by onSessionStarClickDelegate, SignInViewModelDelegate by signInViewModelDelegate { // TODO: remove hardcoded string when https://issuetracker.google.com/136967621 is available private val sessionId = savedStateHandle.get("session_id") // Start observing the user ID right away from the SignInViewModelDelegate private val userIdFlow: StateFlow> = userId.map { Success(it) } .stateIn(viewModelScope, started = Eagerly, initialValue = Loading) // Session & UserData are updated with new user IDs private val sessionUserData = userIdFlow.transformLatest { userId -> if (sessionId != null) { emitAll(loadUserSessionUseCase(userId.data to sessionId)) } else { Timber.e("Session ID is null") emit(Error(Exception("Session not found"))) } }.stateIn(viewModelScope, WhileViewSubscribed, Loading) // WhileViewSubscribed cancels the subscription to loadUserSessionUseCase when it's not needed. init { // SIDE EFFECTS: show Snackbar when there's a message in user data sessionUserData.onEach { result -> result.data?.let { userData -> userData.userMessage?.type?.stringRes()?.let { messageId -> snackbarMessageManager.addMessage( SnackbarMessage( messageId = messageId, longDuration = true, session = userData.userSession.session, requestChangeId = userData.userMessage?.changeRequestId ) ) } } }.launchIn(viewModelScope) } // UserSession is exposed as a StateFlow to the view. It's extracted from sessionUserData. val userSession: StateFlow = sessionUserData.transformLatest { result -> result.data?.userSession?.let { emit(it) } }.stateIn(viewModelScope, started = WhileViewSubscribed, initialValue = null) val userEvent: StateFlow = userSession.transform { userSession -> userSession?.userEvent?.let { emit(it) } }.stateIn(viewModelScope, started = WhileViewSubscribed, initialValue = null) val session: StateFlow = userSession.transform { userSession -> userSession?.session?.let { emit(it) } }.stateIn(viewModelScope, started = WhileViewSubscribed, initialValue = null) // Related user sessions are exposed as a StateFlow and depend on the current session // and user (for favorites). val relatedUserSessions: StateFlow>> = session.combineTransform(userIdFlow) { session, userId -> session?.relatedSessions?.let { related -> emitAll(loadRelatedSessionUseCase(userId.data to related)) } }.stateIn(viewModelScope, started = WhileViewSubscribed, initialValue = Loading) // Exposed to the view to decide whether the feedback button should be visible or not. val showFeedbackButton: StateFlow = sessionUserData.mapLatest { sessionUser -> val currentSession = sessionUser.data?.userSession?.session val userEvent = sessionUser.data?.userSession?.userEvent isUserSignedInValue && userEvent?.isReviewed == false && currentSession?.type == SessionType.SESSION && ( TimeUtils.getSessionState(currentSession, ZonedDateTime.now()) == TimeUtils.SessionRelativeTimeState.AFTER ) }.stateIn(viewModelScope, started = WhileViewSubscribed, initialValue = false) // Exposed to the view to show the Duration until session start, if applicable. val timeUntilStart: LiveData = session.transformLatest { session -> while (true) { // Emit periodically session?.startTime?.let { startTime -> val duration = Duration.between(timeProvider.now(), startTime) when (duration.toMinutes()) { in 1..5 -> emit(duration) else -> emit(null) } } delay(TEN_SECONDS) } }.asLiveData() // TODO: Used by Data Binding https://issuetracker.google.com/184935697 // Exposed to the view to prevent reservations. val isReservationDeniedByCutoff = session.transformLatest { session -> while (true) { // Emit periodically // Only allow reservations if the sessions starts more than an hour from now checkReservationDeniedByCutoff(session)?.let { isDisabled -> emit(isDisabled) } delay(SIXTY_SECONDS) } }.asLiveData() // TODO: Used by Data Binding https://issuetracker.google.com/184935697 private fun checkReservationDeniedByCutoff(session: Session?): Boolean? { return session?.startTime?.let { startTime -> Duration.between(timeProvider.now(), startTime).toMinutes() <= 60 } } // Show the star in bottom nav instead of the FAB if the FAB shows the reservation button. val shouldShowStarInBottomNav = session.combine(isUserRegistered) { session, isRegistered -> isRegistered && session?.isReservable == true } // Exposed to the view to indicate whether the session can be reserved. val isReservable: StateFlow = session.map { it?.isReservable == true && isReservationEnabledByRemoteConfig }.stateIn(viewModelScope, WhileViewSubscribed, false) // Exposed to the view as a StateFlow but it's a one-shot operation. val timeZoneId = flow { if (getTimeZoneUseCase(Unit).successOr(true)) { emit(TimeUtils.CONFERENCE_TIMEZONE) } else { emit(ZoneId.systemDefault()) } }.stateIn(viewModelScope, WhileViewSubscribed, TimeUtils.CONFERENCE_TIMEZONE) // SIDE EFFECTS: Navigation actions private val _navigationActions = Channel(capacity = CONFLATED) // Exposed with receiveAsFlow to make sure that only one observer receives updates. val navigationActions = _navigationActions.receiveAsFlow() /** * Methods called by the UI */ fun onPlayVideo() { session.value?.let { if (it.hasVideo) { _navigationActions.tryOffer(NavigateToYoutube(it.youTubeUrl)) } } } override fun onReservationClicked() { if (!networkUtils.hasNetworkConnection()) { Timber.d("No network connection, ignoring reserve click.") snackbarMessageManager.addMessage( SnackbarMessage( messageId = R.string.no_network_connection, requestChangeId = UUID.randomUUID().toString() ) ) return } if (!isUserSignedInValue) { Timber.d("Showing Sign-in dialog after reserve click") _navigationActions.tryOffer(NavigateToSignInDialogAction) return } val userEventSnapshot = userEvent.value ?: return val sessionSnapshot = session.value ?: return val isReservationDeniedByCutoffSnapshot = checkReservationDeniedByCutoff(sessionSnapshot) ?: return val userId = userIdFlow.value.data ?: return if (userEventSnapshot.isReserved() || userEventSnapshot.isWaitlisted() || userEventSnapshot.isReservationPending() || userEventSnapshot.isCancelPending() // Just in case ) { if (isReservationDeniedByCutoffSnapshot) { snackbarMessageManager.addMessage( SnackbarMessage(R.string.cancellation_denied_cutoff, longDuration = true) ) analyticsHelper.logUiEvent( sessionSnapshot.title, AnalyticsActions.RES_CANCEL_FAILED ) } else { // Open the dialog to confirm if the user really wants to remove their reservation _navigationActions.tryOffer( SessionDetailNavigationAction.RemoveReservationDialogAction( RemoveReservationDialogParameters( userId, sessionSnapshot.id, sessionSnapshot.title ) ) ) analyticsHelper.logUiEvent(sessionSnapshot.title, AnalyticsActions.RES_CANCEL) } return } if (isReservationDeniedByCutoffSnapshot) { snackbarMessageManager.addMessage( SnackbarMessage(R.string.reservation_denied_cutoff, longDuration = true) ) analyticsHelper.logUiEvent(sessionSnapshot.title, AnalyticsActions.RESERVE_FAILED) } else { // New reservation val userSession = UserSession(sessionSnapshot, userEventSnapshot) viewModelScope.launch { val result = reservationActionUseCase( ReservationRequestParameters( userId, sessionSnapshot.id, RequestAction(), userSession ) ) when (result) { is Success -> { val reservationActionResult = result.data if (reservationActionResult is SwapAction) { _navigationActions.tryOffer( NavigateToSwapReservationDialogAction( reservationActionResult.parameters ) ) } } is Error -> { snackbarMessageManager.addMessage( SnackbarMessage(R.string.reservation_error, longDuration = true) ) } Loading -> throw IllegalStateException() } } analyticsHelper.logUiEvent(sessionSnapshot.title, AnalyticsActions.RESERVE) } } override fun onLoginClicked() { if (!isUserSignedInValue) { Timber.d("Showing Sign-in dialog") _navigationActions.tryOffer(NavigateToSignInDialogAction) } } override fun onSpeakerClicked(speakerId: SpeakerId) { _navigationActions.tryOffer(NavigateToSpeakerDetail(speakerId)) } override fun onFeedbackClicked() { session.value?.id?.let { sessionId -> _navigationActions.tryOffer(NavigateToSessionFeedback(sessionId)) } } } interface SessionDetailEventListener : OnSessionStarClickListener { fun onReservationClicked() fun onLoginClicked() fun onSpeakerClicked(speakerId: SpeakerId) fun onFeedbackClicked() } ================================================ FILE: mobile/src/main/java/com/google/samples/apps/iosched/ui/sessiondetail/SessionFeedbackFragment.kt ================================================ /* * Copyright 2019 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.ui.sessiondetail import android.app.Dialog import android.os.Bundle import android.view.LayoutInflater import android.view.ViewGroup import androidx.appcompat.app.AppCompatDialogFragment import androidx.fragment.app.viewModels import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.ListAdapter import androidx.recyclerview.widget.RecyclerView import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.samples.apps.iosched.R import com.google.samples.apps.iosched.databinding.FragmentSessionFeedbackBinding import com.google.samples.apps.iosched.databinding.ItemQuestionBinding import com.google.samples.apps.iosched.model.SessionId import com.google.samples.apps.iosched.shared.result.data import com.google.samples.apps.iosched.util.launchAndRepeatWithViewLifecycle import com.google.samples.apps.iosched.widget.SimpleRatingBar import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.flow.collect @ExperimentalCoroutinesApi @AndroidEntryPoint class SessionFeedbackFragment : AppCompatDialogFragment() { private val viewModel: SessionFeedbackViewModel by viewModels() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) val sessionId = arguments?.getString(ARG_SESSION_ID) if (sessionId == null) { dismiss() } else { viewModel.setSessionId(sessionId) } } override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { val binding = FragmentSessionFeedbackBinding.inflate(LayoutInflater.from(context)) val questionAdapter = QuestionAdapter() binding.questions.run { layoutManager = LinearLayoutManager(context) adapter = questionAdapter } questionAdapter.submitList(viewModel.questions) launchAndRepeatWithViewLifecycle { viewModel.userSession.collect { it.data?.let { dialog?.setTitle(it.session.title) } } } return MaterialAlertDialogBuilder(requireContext()) // The actual title is set asynchronously, but there has to be some title to // initialize the view first. .setTitle("-") .setView(binding.root) .setPositiveButton(R.string.feedback_submit) { _, _ -> viewModel.submit(questionAdapter.feedbackUpdates) (parentFragment as Listener).onFeedbackSubmitted() } .setNegativeButton(android.R.string.cancel, /* ignore */ null) .create() } internal interface Listener { fun onFeedbackSubmitted() } companion object { private const val ARG_SESSION_ID = "session_id" fun createInstance(sessionId: SessionId) = SessionFeedbackFragment().apply { arguments = Bundle().apply { putString(ARG_SESSION_ID, sessionId) } } } } class QuestionViewHolder(val binding: ItemQuestionBinding) : RecyclerView.ViewHolder(binding.root) class QuestionAdapter : ListAdapter(DIFF_CALLBACK) { val feedbackUpdates = mutableMapOf() override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): QuestionViewHolder { return QuestionViewHolder( ItemQuestionBinding.inflate( LayoutInflater.from(parent.context), parent, false ) ) } override fun onBindViewHolder(holder: QuestionViewHolder, position: Int) { val question = getItem(position) holder.binding.question = feedbackUpdates[question.key]?.let { question.copy(currentRating = it) } ?: question holder.binding.rating.setOnRateListener(object : SimpleRatingBar.OnRateListener { override fun onRate(rate: Int) { feedbackUpdates[question.key] = rate } }) } companion object { val DIFF_CALLBACK = object : DiffUtil.ItemCallback() { override fun areItemsTheSame(oldItem: Question, newItem: Question): Boolean { return oldItem.key == newItem.key } override fun areContentsTheSame(oldItem: Question, newItem: Question): Boolean { return oldItem == newItem } } } } ================================================ FILE: mobile/src/main/java/com/google/samples/apps/iosched/ui/sessiondetail/SessionFeedbackViewModel.kt ================================================ /* * Copyright 2019 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.ui.sessiondetail import androidx.annotation.IntRange import androidx.annotation.StringRes import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.google.samples.apps.iosched.R import com.google.samples.apps.iosched.model.SessionId import com.google.samples.apps.iosched.model.userdata.UserSession import com.google.samples.apps.iosched.shared.domain.sessions.LoadUserSessionUseCase import com.google.samples.apps.iosched.shared.domain.users.FeedbackParameter import com.google.samples.apps.iosched.shared.domain.users.FeedbackUseCase import com.google.samples.apps.iosched.shared.result.Result import com.google.samples.apps.iosched.shared.result.Result.Success import com.google.samples.apps.iosched.shared.result.data import com.google.samples.apps.iosched.shared.util.cancelIfActive import com.google.samples.apps.iosched.ui.signin.SignInViewModelDelegate import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.Job import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.collect import kotlinx.coroutines.launch import javax.inject.Inject @HiltViewModel class SessionFeedbackViewModel @Inject constructor( private val signInViewModelDelegate: SignInViewModelDelegate, private val loadUserSessionUseCase: LoadUserSessionUseCase, private val feedbackUseCase: FeedbackUseCase ) : ViewModel(), SignInViewModelDelegate by signInViewModelDelegate { companion object { val MESSAGES = mapOf( "q1" to Triple( R.string.feedback_q1_text, R.string.feedback_q1_label_start, R.string.feedback_q1_label_end ), "q2" to Triple( R.string.feedback_q2_text, R.string.feedback_q2_label_start, R.string.feedback_q2_label_end ), "q3" to Triple( R.string.feedback_q3_text, R.string.feedback_q3_label_start, R.string.feedback_q3_label_end ), "q4" to Triple( R.string.feedback_q4_text, R.string.feedback_q4_label_start, R.string.feedback_q4_label_end ) ) } private var loadUserSessionJob: Job? = null private var _sessionId: SessionId? = null private val _userSession = MutableStateFlow>(Result.Loading) val userSession: StateFlow> = _userSession val questions = MESSAGES.map { (key, value) -> val (text, start, end) = value Question(key, text, 0, start, end) } fun setSessionId(sessionId: SessionId) { _sessionId = sessionId loadUserSessionJob.cancelIfActive() loadUserSessionJob = viewModelScope.launch { loadUserSessionUseCase(userIdValue to sessionId).collect { result -> result.data?.userSession?.let { success -> _userSession.value = Success(success) } } } } fun submit(feedbackUpdates: Map) { val sessionId = _sessionId ?: return val userId = userIdValue val userEvent = _userSession.value.data?.userEvent if (userId != null && userEvent != null) { viewModelScope.launch { feedbackUseCase( FeedbackParameter( userId, userEvent, sessionId, feedbackUpdates ) ) } } } } /** * Data model for the list. */ data class Question( val key: String, @StringRes val text: Int, /** 0 means unrated. Actual ratings are 1-5. */ @IntRange(from = 0, to = 5) val currentRating: Int, @StringRes val labelStart: Int, @StringRes val labelEnd: Int ) ================================================ FILE: mobile/src/main/java/com/google/samples/apps/iosched/ui/settings/SettingsFragment.kt ================================================ /* * Copyright 2018 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.ui.settings import android.app.AlertDialog import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.webkit.WebView import android.widget.TextView import androidx.core.view.WindowInsetsCompat import androidx.core.view.updatePadding import androidx.databinding.BindingAdapter import androidx.fragment.app.viewModels import com.google.samples.apps.iosched.R import com.google.samples.apps.iosched.databinding.FragmentSettingsBinding import com.google.samples.apps.iosched.ui.MainActivityViewModel import com.google.samples.apps.iosched.ui.MainNavigationFragment import com.google.samples.apps.iosched.ui.signin.setupProfileMenuItem import com.google.samples.apps.iosched.util.doOnApplyWindowInsets import com.google.samples.apps.iosched.util.launchAndRepeatWithViewLifecycle import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.flow.collect @AndroidEntryPoint class SettingsFragment : MainNavigationFragment() { private val viewModel: SettingsViewModel by viewModels() private val mainActivityViewModel: MainActivityViewModel by viewModels() override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View { launchAndRepeatWithViewLifecycle { viewModel.navigationActions.collect { if (it is SettingsNavigationAction.NavigateToThemeSelector) { ThemeSettingDialogFragment.newInstance() .show(parentFragmentManager, null) } } } val binding = FragmentSettingsBinding.inflate(inflater, container, false) binding.viewModel = viewModel binding.lifecycleOwner = viewLifecycleOwner binding.toolbar.setupProfileMenuItem(mainActivityViewModel, viewLifecycleOwner) binding.settingsScroll.doOnApplyWindowInsets { v, insets, padding -> val systemInsets = insets.getInsets( WindowInsetsCompat.Type.systemBars() or WindowInsetsCompat.Type.ime() ) v.updatePadding(bottom = padding.bottom + systemInsets.bottom) } return binding.root } } @BindingAdapter(value = ["dialogTitle", "fileLink"], requireAll = true) fun createDialogForFile(button: View, dialogTitle: String, fileLink: String) { val context = button.context button.setOnClickListener { val webView = WebView(context).apply { loadUrl(fileLink) } webView.settings.useWideViewPort = true webView.settings.loadWithOverviewMode = true AlertDialog.Builder(context) .setTitle(dialogTitle) .setView(webView) .create() .show() } } @BindingAdapter("versionName") fun setVersionName(view: TextView, versionName: String) { view.text = view.resources.getString(R.string.version_name, versionName) } ================================================ FILE: mobile/src/main/java/com/google/samples/apps/iosched/ui/settings/SettingsViewModel.kt ================================================ /* * Copyright 2018 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.ui.settings import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.google.samples.apps.iosched.model.Theme import com.google.samples.apps.iosched.shared.domain.prefs.NotificationsPrefSaveActionUseCase import com.google.samples.apps.iosched.shared.domain.settings.GetAnalyticsSettingUseCase import com.google.samples.apps.iosched.shared.domain.settings.GetAvailableThemesUseCase import com.google.samples.apps.iosched.shared.domain.settings.GetNotificationsSettingUseCase import com.google.samples.apps.iosched.shared.domain.settings.GetThemeUseCase import com.google.samples.apps.iosched.shared.domain.settings.GetTimeZoneUseCase import com.google.samples.apps.iosched.shared.domain.settings.SetAnalyticsSettingUseCase import com.google.samples.apps.iosched.shared.domain.settings.SetThemeUseCase import com.google.samples.apps.iosched.shared.domain.settings.SetTimeZoneUseCase import com.google.samples.apps.iosched.shared.result.data import com.google.samples.apps.iosched.shared.util.tryOffer import com.google.samples.apps.iosched.util.WhileViewSubscribed import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.channels.Channel import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.emitAll import kotlinx.coroutines.flow.flow import kotlinx.coroutines.flow.mapLatest import kotlinx.coroutines.flow.receiveAsFlow import kotlinx.coroutines.flow.stateIn import kotlinx.coroutines.launch import javax.inject.Inject @HiltViewModel class SettingsViewModel @Inject constructor( val setTimeZoneUseCase: SetTimeZoneUseCase, getTimeZoneUseCase: GetTimeZoneUseCase, val notificationsPrefSaveActionUseCase: NotificationsPrefSaveActionUseCase, getNotificationsSettingUseCase: GetNotificationsSettingUseCase, val setAnalyticsSettingUseCase: SetAnalyticsSettingUseCase, getAnalyticsSettingUseCase: GetAnalyticsSettingUseCase, val setThemeUseCase: SetThemeUseCase, getThemeUseCase: GetThemeUseCase, getAvailableThemesUseCase: GetAvailableThemesUseCase ) : ViewModel() { // Used to re-run flows on command private val refreshSignal = MutableSharedFlow() // Used to run flows on init and also on command private val loadDataSignal: Flow = flow { emit(Unit) emitAll(refreshSignal) } // Time Zone setting val preferConferenceTimeZone: StateFlow = loadDataSignal.mapLatest { getTimeZoneUseCase(Unit).data ?: true }.stateIn(viewModelScope, WhileViewSubscribed, true) val enableNotifications: StateFlow = loadDataSignal.mapLatest { getNotificationsSettingUseCase(Unit).data ?: true }.stateIn(viewModelScope, WhileViewSubscribed, true) // Analytics setting val sendUsageStatistics = loadDataSignal.combine(getAnalyticsSettingUseCase(Unit)) { _, result -> result.data ?: false }.stateIn(viewModelScope, WhileViewSubscribed, false) // Theme setting val theme: StateFlow = loadDataSignal.mapLatest { getThemeUseCase(Unit).data ?: Theme.SYSTEM }.stateIn(viewModelScope, WhileViewSubscribed, Theme.SYSTEM) // Theme setting val availableThemes: StateFlow> = loadDataSignal.mapLatest { getAvailableThemesUseCase(Unit).data ?: listOf() }.stateIn(viewModelScope, WhileViewSubscribed, listOf()) // SIDE EFFECTS: Navigation actions private val _navigationActions = Channel(capacity = Channel.CONFLATED) // Exposed with receiveAsFlow to make sure that only one observer receives updates. val navigationActions = _navigationActions.receiveAsFlow() private suspend fun refreshData() { refreshSignal.emit(Unit) } fun toggleTimeZone() { viewModelScope.launch { setTimeZoneUseCase(!preferConferenceTimeZone.value) refreshData() } } fun toggleEnableNotifications() { viewModelScope.launch { notificationsPrefSaveActionUseCase(!enableNotifications.value) refreshData() } } fun toggleSendUsageStatistics() { viewModelScope.launch { setAnalyticsSettingUseCase(!sendUsageStatistics.value) refreshData() } } fun setTheme(theme: Theme) { viewModelScope.launch { setThemeUseCase(theme) } } fun onThemeSettingClicked() { _navigationActions.tryOffer(SettingsNavigationAction.NavigateToThemeSelector) } } sealed class SettingsNavigationAction { object NavigateToThemeSelector : SettingsNavigationAction() } ================================================ FILE: mobile/src/main/java/com/google/samples/apps/iosched/ui/settings/ThemeSettingDialogFragment.kt ================================================ /* * Copyright 2019 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.ui.settings import android.app.Dialog import android.os.Bundle import android.widget.ArrayAdapter import androidx.appcompat.app.AlertDialog import androidx.appcompat.app.AppCompatDialogFragment import androidx.fragment.app.viewModels import androidx.lifecycle.Lifecycle import androidx.lifecycle.lifecycleScope import androidx.lifecycle.repeatOnLifecycle import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.samples.apps.iosched.R import com.google.samples.apps.iosched.model.Theme import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.flow.collect import kotlinx.coroutines.launch @AndroidEntryPoint class ThemeSettingDialogFragment : AppCompatDialogFragment() { private val viewModel: SettingsViewModel by viewModels() private lateinit var listAdapter: ArrayAdapter override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { listAdapter = ArrayAdapter( requireContext(), android.R.layout.simple_list_item_single_choice ) return MaterialAlertDialogBuilder(requireContext()) .setTitle(R.string.settings_theme_title) .setSingleChoiceItems(listAdapter, 0) { dialog, position -> listAdapter.getItem(position)?.theme?.let { viewModel.setTheme(it) } dialog.dismiss() } .create() } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) // Note you don't need to use viewLifecycleOwner in DialogFragment. lifecycleScope.launch { lifecycle.repeatOnLifecycle(Lifecycle.State.STARTED) { viewModel.availableThemes.collect { themes -> listAdapter.clear() listAdapter.addAll( themes.map { theme -> ThemeHolder(theme, getTitleForTheme(theme)) } ) updateSelectedItem(viewModel.theme.value) } } } lifecycleScope.launch { lifecycle.repeatOnLifecycle(Lifecycle.State.STARTED) { viewModel.theme.collect { updateSelectedItem(it) } } } } private fun updateSelectedItem(selected: Theme?) { val selectedPosition = (0 until listAdapter.count).indexOfFirst { index -> listAdapter.getItem(index)?.theme == selected } (dialog as AlertDialog).listView.setItemChecked(selectedPosition, true) } private fun getTitleForTheme(theme: Theme) = when (theme) { Theme.LIGHT -> getString(R.string.settings_theme_light) Theme.DARK -> getString(R.string.settings_theme_dark) Theme.SYSTEM -> getString(R.string.settings_theme_system) Theme.BATTERY_SAVER -> getString(R.string.settings_theme_battery) } companion object { fun newInstance() = ThemeSettingDialogFragment() } private data class ThemeHolder(val theme: Theme, val title: String) { override fun toString(): String = title } } ================================================ FILE: mobile/src/main/java/com/google/samples/apps/iosched/ui/signin/NotificationsPreferenceDialogFragment.kt ================================================ /* * Copyright 2018 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.ui.signin import android.app.Dialog import android.content.DialogInterface import android.os.Bundle import androidx.appcompat.app.AppCompatDialogFragment import androidx.lifecycle.lifecycleScope import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.samples.apps.iosched.R import com.google.samples.apps.iosched.shared.di.ApplicationScope import com.google.samples.apps.iosched.shared.domain.prefs.NotificationsPrefSaveActionUseCase import com.google.samples.apps.iosched.shared.domain.prefs.NotificationsPrefShownActionUseCase import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.launch import javax.inject.Inject /** * Dialog that asks for the user's notifications preference. */ @AndroidEntryPoint class NotificationsPreferenceDialogFragment : AppCompatDialogFragment() { @Inject lateinit var notificationsPrefSaveActionUseCase: NotificationsPrefSaveActionUseCase @Inject lateinit var notificationsPrefShownActionUseCase: NotificationsPrefShownActionUseCase @Inject @ApplicationScope lateinit var applicationScope: CoroutineScope override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { return MaterialAlertDialogBuilder(requireContext()) .setTitle(R.string.notifications_preference_dialog_title) .setMessage(R.string.notifications_preference_dialog_content) .setNegativeButton(R.string.no) { _, _ -> lifecycleScope.launch { notificationsPrefSaveActionUseCase(false) } } .setPositiveButton(R.string.yes) { _, _ -> lifecycleScope.launch { notificationsPrefSaveActionUseCase(true) } } .create() } override fun onDismiss(dialog: DialogInterface) { applicationScope.launch { notificationsPrefShownActionUseCase(true) } super.onDismiss(dialog) } companion object { const val DIALOG_NOTIFICATIONS_PREFERENCE = "dialog_notifications_preference" } } ================================================ FILE: mobile/src/main/java/com/google/samples/apps/iosched/ui/signin/SignInDialogFragment.kt ================================================ /* * Copyright 2018 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.ui.signin import android.app.Dialog import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.appcompat.app.AlertDialog import androidx.appcompat.app.AppCompatDialogFragment import androidx.fragment.app.viewModels import androidx.lifecycle.Lifecycle import androidx.lifecycle.lifecycleScope import androidx.lifecycle.repeatOnLifecycle import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.samples.apps.iosched.databinding.DialogSignInBinding import com.google.samples.apps.iosched.ui.signin.SignInNavigationAction.RequestSignIn import com.google.samples.apps.iosched.util.executeAfter import com.google.samples.apps.iosched.util.signin.SignInHandler import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.flow.collect import kotlinx.coroutines.launch import javax.inject.Inject /** * Dialog that tells the user to sign in to continue the operation. */ @AndroidEntryPoint class SignInDialogFragment : AppCompatDialogFragment() { @Inject lateinit var signInHandler: SignInHandler private val signInViewModel: SignInViewModel by viewModels() private lateinit var binding: DialogSignInBinding override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { // We want to create a dialog, but we also want to use DataBinding for the content view. // We can do that by making an empty dialog and adding the content later. return MaterialAlertDialogBuilder(requireContext()).create() } override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View { // In case we are showing as a dialog, use getLayoutInflater() instead. binding = DialogSignInBinding.inflate(layoutInflater, container, false) return binding.root } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) lifecycleScope.launch { lifecycle.repeatOnLifecycle(Lifecycle.State.STARTED) { signInViewModel.signInNavigationActions.collect { action -> if (action == RequestSignIn) { activity?.startActivityForResult( signInHandler.makeSignInIntent(), REQUEST_CODE_SIGN_IN ) dismiss() } } } } binding.executeAfter { viewModel = signInViewModel lifecycleOwner = viewLifecycleOwner } if (showsDialog) { (requireDialog() as AlertDialog).setView(binding.root) } } companion object { const val DIALOG_SIGN_IN = "dialog_sign_in" const val REQUEST_CODE_SIGN_IN = 42 } } ================================================ FILE: mobile/src/main/java/com/google/samples/apps/iosched/ui/signin/SignInViewExtensions.kt ================================================ /* * Copyright 2019 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.ui.signin import android.content.Context import android.content.res.Resources import android.graphics.drawable.Drawable import android.net.Uri import android.view.MenuItem import androidx.appcompat.content.res.AppCompatResources import androidx.appcompat.widget.Toolbar import androidx.core.view.MenuItemCompat import androidx.lifecycle.Lifecycle.State.STARTED import androidx.lifecycle.LifecycleOwner import androidx.lifecycle.lifecycleScope import androidx.lifecycle.repeatOnLifecycle import com.bumptech.glide.Glide import com.bumptech.glide.request.RequestOptions import com.bumptech.glide.request.target.Target import com.google.samples.apps.iosched.R import com.google.samples.apps.iosched.shared.data.signin.AuthenticatedUserInfo import com.google.samples.apps.iosched.ui.MainActivityViewModel import com.google.samples.apps.iosched.util.asGlideTarget import kotlinx.coroutines.flow.collect import kotlinx.coroutines.launch fun Toolbar.setupProfileMenuItem( viewModel: MainActivityViewModel, lifecycleOwner: LifecycleOwner ) { inflateMenu(R.menu.profile) val profileItem = menu.findItem(R.id.action_profile) ?: return profileItem.setOnMenuItemClickListener { viewModel.onProfileClicked() true } lifecycleOwner.lifecycleScope.launch { lifecycleOwner.lifecycle.repeatOnLifecycle(STARTED) { viewModel.userInfo.collect { setProfileContentDescription(profileItem, resources, it) } } } val avatarSize = resources.getDimensionPixelSize(R.dimen.nav_account_image_size) val target = profileItem.asGlideTarget(avatarSize) lifecycleOwner.lifecycleScope.launch { lifecycleOwner.lifecycle.repeatOnLifecycle(STARTED) { viewModel.currentUserImageUri.collect { setProfileAvatar(context, target, it) } } } } fun setProfileContentDescription(item: MenuItem, res: Resources, user: AuthenticatedUserInfo?) { val description = if (user?.isSignedIn() == true) { res.getString(R.string.a11y_signed_in_content_description, user.getDisplayName()) } else { res.getString(R.string.a11y_signed_out_content_description) } MenuItemCompat.setContentDescription(item, description) } fun setProfileAvatar( context: Context, target: Target, imageUri: Uri?, placeholder: Int = R.drawable.ic_default_profile_avatar ) { // Inflate the drawable for proper tinting val placeholderDrawable = AppCompatResources.getDrawable(context, placeholder) when (imageUri) { null -> { Glide.with(context) .load(placeholderDrawable) .apply(RequestOptions.circleCropTransform()) .into(target) } else -> { Glide.with(context) .load(imageUri) .apply(RequestOptions.placeholderOf(placeholderDrawable).circleCrop()) .into(target) } } } ================================================ FILE: mobile/src/main/java/com/google/samples/apps/iosched/ui/signin/SignInViewModel.kt ================================================ /* * Copyright 2018 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.ui.signin import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.launch import timber.log.Timber import javax.inject.Inject /** * ViewModel for *both* the sign in & sign out dialogs. */ @HiltViewModel class SignInViewModel @Inject constructor( signInViewModelDelegate: SignInViewModelDelegate ) : ViewModel(), SignInViewModelDelegate by signInViewModelDelegate { fun onSignIn() { viewModelScope.launch { Timber.d("Sign in requested") emitSignInRequest() } } fun onSignOut() { viewModelScope.launch { Timber.d("Sign out requested") emitSignOutRequest() } } } ================================================ FILE: mobile/src/main/java/com/google/samples/apps/iosched/ui/signin/SignInViewModelDelegate.kt ================================================ /* * Copyright 2018 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.ui.signin import android.net.Uri import com.google.samples.apps.iosched.shared.data.signin.AuthenticatedUserInfo import com.google.samples.apps.iosched.shared.di.ApplicationScope import com.google.samples.apps.iosched.shared.di.IoDispatcher import com.google.samples.apps.iosched.shared.di.MainDispatcher import com.google.samples.apps.iosched.shared.di.ReservationEnabledFlag import com.google.samples.apps.iosched.shared.domain.auth.ObserveUserAuthStateUseCase import com.google.samples.apps.iosched.shared.domain.prefs.NotificationsPrefIsShownUseCase import com.google.samples.apps.iosched.shared.result.Result import com.google.samples.apps.iosched.shared.result.Result.Success import com.google.samples.apps.iosched.shared.result.data import com.google.samples.apps.iosched.shared.util.tryOffer import com.google.samples.apps.iosched.ui.signin.SignInNavigationAction.ShowNotificationPreferencesDialog import com.google.samples.apps.iosched.util.WhileViewSubscribed import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.channels.Channel import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.collect import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.mapLatest import kotlinx.coroutines.flow.receiveAsFlow import kotlinx.coroutines.flow.stateIn import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import timber.log.Timber import javax.inject.Inject enum class SignInNavigationAction { RequestSignIn, RequestSignOut, ShowNotificationPreferencesDialog } /** * Interface to implement sign-in functionality in a ViewModel. * * You can inject a implementation of this via Dagger2, then use the implementation as an interface * delegate to add sign in functionality without writing any code * * Example usage * * ``` * class MyViewModel @Inject constructor( * signInViewModelComponent: SignInViewModelDelegate * ) : ViewModel(), SignInViewModelDelegate by signInViewModelComponent { * ``` */ interface SignInViewModelDelegate { /** * Live updated value of the current firebase user */ val userInfo: StateFlow /** * Live updated value of the current firebase users image url */ val currentUserImageUri: StateFlow /** * Emits Events when a sign-in event should be attempted or a dialog shown */ val signInNavigationActions: Flow /** * Emits whether or not to show reservations for the current user */ val showReservations: StateFlow /** * Emit an Event on performSignInEvent to request sign-in */ suspend fun emitSignInRequest() /** * Emit an Event on performSignInEvent to request sign-out */ suspend fun emitSignOutRequest() val userId: Flow /** * Returns the current user ID or null if not available. */ val userIdValue: String? val isUserSignedIn: StateFlow val isUserSignedInValue: Boolean val isUserRegistered: StateFlow val isUserRegisteredValue: Boolean } /** * Implementation of SignInViewModelDelegate that uses Firebase's auth mechanisms. */ internal class FirebaseSignInViewModelDelegate @Inject constructor( observeUserAuthStateUseCase: ObserveUserAuthStateUseCase, private val notificationsPrefIsShownUseCase: NotificationsPrefIsShownUseCase, @IoDispatcher private val ioDispatcher: CoroutineDispatcher, @MainDispatcher private val mainDispatcher: CoroutineDispatcher, @ReservationEnabledFlag val isReservationEnabledByRemoteConfig: Boolean, @ApplicationScope val applicationScope: CoroutineScope ) : SignInViewModelDelegate { private val _signInNavigationActions = Channel(Channel.CONFLATED) override val signInNavigationActions = _signInNavigationActions.receiveAsFlow() private val currentFirebaseUser: Flow> = observeUserAuthStateUseCase(Any()).map { if (it is Result.Error) { Timber.e(it.exception) } it } override val userInfo: StateFlow = currentFirebaseUser.map { (it as? Success)?.data }.stateIn(applicationScope, WhileViewSubscribed, null) override val currentUserImageUri: StateFlow = userInfo.map { it?.getPhotoUrl() }.stateIn(applicationScope, WhileViewSubscribed, null) override val isUserSignedIn: StateFlow = userInfo.map { it?.isSignedIn() ?: false }.stateIn(applicationScope, WhileViewSubscribed, false) override val isUserRegistered: StateFlow = userInfo.map { it?.isRegistered() ?: false }.stateIn(applicationScope, WhileViewSubscribed, false) init { applicationScope.launch { userInfo.collect { if (notificationsPrefIsShownUseCase(Unit).data == false && isUserSignedInValue) { _signInNavigationActions.tryOffer(ShowNotificationPreferencesDialog) } } } } override val showReservations: StateFlow = userInfo.map { (isUserRegisteredValue || !isUserSignedInValue) && isReservationEnabledByRemoteConfig }.stateIn(applicationScope, WhileViewSubscribed, false) override suspend fun emitSignInRequest(): Unit = withContext(ioDispatcher) { // Refresh the notificationsPrefIsShown because it's used to indicate if the // notifications preference dialog should be shown notificationsPrefIsShownUseCase(Unit) _signInNavigationActions.tryOffer(SignInNavigationAction.RequestSignIn) } override suspend fun emitSignOutRequest(): Unit = withContext(mainDispatcher) { _signInNavigationActions.tryOffer(SignInNavigationAction.RequestSignOut) } override val isUserSignedInValue: Boolean get() = isUserSignedIn.value override val isUserRegisteredValue: Boolean get() = isUserRegistered.value override val userIdValue: String? get() = userInfo.value?.getUid() override val userId: StateFlow get() = userInfo.mapLatest { it?.getUid() } .stateIn(applicationScope, WhileViewSubscribed, null) } ================================================ FILE: mobile/src/main/java/com/google/samples/apps/iosched/ui/signin/SignInViewModelDelegateModule.kt ================================================ /* * Copyright 2018 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.ui.signin import com.google.samples.apps.iosched.shared.di.ApplicationScope import com.google.samples.apps.iosched.shared.di.IoDispatcher import com.google.samples.apps.iosched.shared.di.MainDispatcher import com.google.samples.apps.iosched.shared.di.ReservationEnabledFlag import com.google.samples.apps.iosched.shared.domain.auth.ObserveUserAuthStateUseCase import com.google.samples.apps.iosched.shared.domain.prefs.NotificationsPrefIsShownUseCase import dagger.Module import dagger.Provides import dagger.hilt.InstallIn import dagger.hilt.components.SingletonComponent import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.CoroutineScope import javax.inject.Singleton @InstallIn(SingletonComponent::class) @Module class SignInViewModelDelegateModule { @Singleton @Provides fun provideSignInViewModelDelegate( dataSource: ObserveUserAuthStateUseCase, notificationsPrefIsShownUseCase: NotificationsPrefIsShownUseCase, @IoDispatcher ioDispatcher: CoroutineDispatcher, @MainDispatcher mainDispatcher: CoroutineDispatcher, @ReservationEnabledFlag isReservationEnabledByRemoteConfig: Boolean, @ApplicationScope applicationScope: CoroutineScope ): SignInViewModelDelegate { return FirebaseSignInViewModelDelegate( observeUserAuthStateUseCase = dataSource, notificationsPrefIsShownUseCase = notificationsPrefIsShownUseCase, ioDispatcher = ioDispatcher, mainDispatcher = mainDispatcher, isReservationEnabledByRemoteConfig = isReservationEnabledByRemoteConfig, applicationScope = applicationScope ) } } ================================================ FILE: mobile/src/main/java/com/google/samples/apps/iosched/ui/signin/SignOutDialogFragment.kt ================================================ /* * Copyright 2018 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.ui.signin import android.app.Dialog import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.TextView import androidx.appcompat.app.AlertDialog import androidx.appcompat.app.AppCompatDialogFragment import androidx.core.view.isGone import androidx.databinding.BindingAdapter import androidx.fragment.app.viewModels import androidx.lifecycle.Lifecycle import androidx.lifecycle.lifecycleScope import androidx.lifecycle.repeatOnLifecycle import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.samples.apps.iosched.databinding.DialogSignOutBinding import com.google.samples.apps.iosched.shared.data.signin.AuthenticatedUserInfo import com.google.samples.apps.iosched.ui.signin.SignInNavigationAction.RequestSignOut import com.google.samples.apps.iosched.util.executeAfter import com.google.samples.apps.iosched.util.signin.SignInHandler import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.flow.collect import kotlinx.coroutines.launch import javax.inject.Inject /** * Dialog that confirms that a user wishes to sign out. */ @AndroidEntryPoint class SignOutDialogFragment : AppCompatDialogFragment() { @Inject lateinit var signInHandler: SignInHandler private val signInViewModel: SignInViewModel by viewModels() private lateinit var binding: DialogSignOutBinding override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { // We want to create a dialog, but we also want to use DataBinding for the content view. // We can do that by making an empty dialog and adding the content later. return MaterialAlertDialogBuilder(requireContext()).create() } override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? { // In case we are showing as a dialog, use getLayoutInflater() instead. binding = DialogSignOutBinding.inflate(layoutInflater, container, false) return binding.root } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) lifecycleScope.launch { lifecycle.repeatOnLifecycle(Lifecycle.State.STARTED) { signInViewModel.signInNavigationActions.collect { action -> if (action == RequestSignOut) { signInHandler.signOut(requireContext()) dismiss() } } } } binding.executeAfter { viewModel = signInViewModel lifecycleOwner = viewLifecycleOwner } if (showsDialog) { (requireDialog() as AlertDialog).setView(binding.root) } } } @BindingAdapter("username") fun setUsername(textView: TextView, userInfo: AuthenticatedUserInfo?) { val displayName = userInfo?.getDisplayName() textView.text = displayName textView.isGone = displayName.isNullOrEmpty() } @BindingAdapter("userEmail") fun setUserEmail(textView: TextView, userInfo: AuthenticatedUserInfo?) { val email = userInfo?.getEmail() textView.text = email textView.isGone = email.isNullOrEmpty() } ================================================ FILE: mobile/src/main/java/com/google/samples/apps/iosched/ui/speaker/SpeakerAdapter.kt ================================================ /* * Copyright 2018 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.ui.speaker import android.annotation.SuppressLint import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.lifecycle.LifecycleOwner import androidx.recyclerview.widget.AsyncListDiffer import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView.RecycledViewPool import com.google.samples.apps.iosched.R import com.google.samples.apps.iosched.databinding.ItemGenericSectionHeaderBinding import com.google.samples.apps.iosched.databinding.ItemSessionBinding import com.google.samples.apps.iosched.databinding.ItemSpeakerInfoBinding import com.google.samples.apps.iosched.model.userdata.UserSession import com.google.samples.apps.iosched.ui.SectionHeader import com.google.samples.apps.iosched.ui.sessioncommon.OnSessionClickListener import com.google.samples.apps.iosched.ui.speaker.SpeakerViewHolder.HeaderViewHolder import com.google.samples.apps.iosched.ui.speaker.SpeakerViewHolder.SpeakerInfoViewHolder import com.google.samples.apps.iosched.ui.speaker.SpeakerViewHolder.SpeakerSessionViewHolder import com.google.samples.apps.iosched.util.executeAfter import java.util.Collections.emptyList /** * [RecyclerView.Adapter] for presenting a speaker details, composed of information about the * speaker and any sessions that the speaker presents. */ class SpeakerAdapter( private val lifecycleOwner: LifecycleOwner, private val speakerViewModel: SpeakerViewModel, private val onSessionClickListener: OnSessionClickListener, private val tagRecycledViewPool: RecycledViewPool ) : RecyclerView.Adapter() { private val differ = AsyncListDiffer(this, DiffCallback) var speakerSessions: List = emptyList() set(value) { field = value differ.submitList(buildMergedList(sessions = value)) } init { differ.submitList(buildMergedList()) } override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): SpeakerViewHolder { val inflater = LayoutInflater.from(parent.context) return when (viewType) { R.layout.item_speaker_info -> SpeakerInfoViewHolder( ItemSpeakerInfoBinding.inflate(inflater, parent, false) ) R.layout.item_session -> SpeakerSessionViewHolder( ItemSessionBinding.inflate(inflater, parent, false).apply { tags.setRecycledViewPool(tagRecycledViewPool) } ) R.layout.item_generic_section_header -> HeaderViewHolder( ItemGenericSectionHeaderBinding.inflate(inflater, parent, false) ) else -> throw IllegalStateException("Unknown viewType $viewType") } } override fun onBindViewHolder(holder: SpeakerViewHolder, position: Int) { when (holder) { is SpeakerInfoViewHolder -> holder.binding.executeAfter { viewModel = speakerViewModel lifecycleOwner = this@SpeakerAdapter.lifecycleOwner } is SpeakerSessionViewHolder -> holder.binding.executeAfter { userSession = differ.currentList[position] as UserSession timeZoneId = speakerViewModel.timeZoneId sessionClickListener = onSessionClickListener sessionStarClickListener = speakerViewModel showTime = true lifecycleOwner = this@SpeakerAdapter.lifecycleOwner } is HeaderViewHolder -> holder.binding.executeAfter { sectionHeader = differ.currentList[position] as SectionHeader } } } override fun getItemViewType(position: Int): Int { return when (differ.currentList[position]) { SpeakerItem -> R.layout.item_speaker_info is UserSession -> R.layout.item_session is SectionHeader -> R.layout.item_generic_section_header else -> throw IllegalStateException("Unknown view type at position $position") } } override fun getItemCount() = differ.currentList.size /** * This adapter displays heterogeneous data types but `RecyclerView` & `AsyncListDiffer` deal in * a single list of items. We therefore combine them into a merged list, using marker objects * for static items. We still hold separate lists of [speakerSessions] so that * we can provide them individually, as they're loaded. */ private fun buildMergedList( sessions: List = speakerSessions ): List { val merged = mutableListOf(SpeakerItem) if (sessions.isNotEmpty()) { merged += SectionHeader(R.string.speaker_events_subhead) merged.addAll(sessions) } return merged } } // Marker object for use in our merged representation. object SpeakerItem /** * Diff items presented by this adapter. */ object DiffCallback : DiffUtil.ItemCallback() { override fun areItemsTheSame(oldItem: Any, newItem: Any): Boolean { return when { oldItem === SpeakerItem && newItem === SpeakerItem -> true oldItem is SectionHeader && newItem is SectionHeader -> oldItem == newItem oldItem is UserSession && newItem is UserSession -> oldItem.session.id == newItem.session.id else -> false } } @SuppressLint("DiffUtilEquals") // Workaround of https://issuetracker.google.com/issues/122928037 override fun areContentsTheSame(oldItem: Any, newItem: Any): Boolean { return when { oldItem is UserSession && newItem is UserSession -> oldItem == newItem else -> true } } } /** * [RecyclerView.ViewHolder] types used by this adapter. */ sealed class SpeakerViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { class SpeakerInfoViewHolder( val binding: ItemSpeakerInfoBinding ) : SpeakerViewHolder(binding.root) class SpeakerSessionViewHolder( val binding: ItemSessionBinding ) : SpeakerViewHolder(binding.root) class HeaderViewHolder( val binding: ItemGenericSectionHeaderBinding ) : SpeakerViewHolder(binding.root) } ================================================ FILE: mobile/src/main/java/com/google/samples/apps/iosched/ui/speaker/SpeakerBindingAdapters.kt ================================================ /* * Copyright 2018 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.ui.speaker import android.annotation.SuppressLint import android.graphics.drawable.Drawable import android.widget.ImageView import androidx.databinding.BindingAdapter import com.bumptech.glide.Glide import com.bumptech.glide.load.DataSource import com.bumptech.glide.load.engine.GlideException import com.bumptech.glide.request.RequestListener import com.bumptech.glide.request.RequestOptions import com.bumptech.glide.request.target.Target import com.google.samples.apps.iosched.R import com.google.samples.apps.iosched.model.Speaker /** * Loads a [Speaker]'s photo or picks a default avatar if no photo is specified. */ @SuppressLint("CheckResult") @BindingAdapter(value = ["speakerImage", "listener"], requireAll = false) fun speakerImage( imageView: ImageView, speaker: Speaker?, listener: ImageLoadListener? ) { speaker ?: return // Want a 'random' default avatar but should be stable as used on both session details & // speaker detail screens (as a shared element transition), so use id to pick. val placeholderId = when (speaker.id.hashCode() % 3) { 0 -> R.drawable.ic_default_avatar_1 1 -> R.drawable.ic_default_avatar_2 else -> R.drawable.ic_default_avatar_3 } if (speaker.imageUrl.isBlank()) { imageView.setImageResource(placeholderId) } else { val imageLoad = Glide.with(imageView) .load(speaker.imageUrl) .apply( RequestOptions() .placeholder(placeholderId) .circleCrop() ) if (listener != null) { imageLoad.listener(object : RequestListener { override fun onResourceReady( resource: Drawable?, model: Any?, target: Target?, dataSource: DataSource?, isFirstResource: Boolean ): Boolean { listener.onImageLoaded() return false } override fun onLoadFailed( e: GlideException?, model: Any?, target: Target?, isFirstResource: Boolean ): Boolean { listener.onImageLoadFailed() return false } }) } imageLoad.into(imageView) } } /** * An interface for responding to image loading completion. */ interface ImageLoadListener { fun onImageLoaded() fun onImageLoadFailed() } ================================================ FILE: mobile/src/main/java/com/google/samples/apps/iosched/ui/speaker/SpeakerFragment.kt ================================================ /* * Copyright 2018 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.ui.speaker import android.os.Bundle import android.view.ContextThemeWrapper import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.core.view.WindowInsetsCompat import androidx.core.view.doOnNextLayout import androidx.core.view.updatePadding import androidx.fragment.app.Fragment import androidx.fragment.app.activityViewModels import androidx.fragment.app.viewModels import androidx.navigation.fragment.findNavController import androidx.recyclerview.widget.RecyclerView.RecycledViewPool import androidx.transition.TransitionInflater import com.google.android.material.appbar.AppBarLayout import com.google.android.material.appbar.AppBarLayout.OnOffsetChangedListener import com.google.samples.apps.iosched.R import com.google.samples.apps.iosched.databinding.FragmentSpeakerBinding import com.google.samples.apps.iosched.shared.analytics.AnalyticsHelper import com.google.samples.apps.iosched.ui.messages.SnackbarMessageManager import com.google.samples.apps.iosched.ui.schedule.ScheduleTwoPaneViewModel import com.google.samples.apps.iosched.util.doOnApplyWindowInsets import com.google.samples.apps.iosched.util.launchAndRepeatWithViewLifecycle import com.google.samples.apps.iosched.util.setContentMaxWidth import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.launch import java.util.concurrent.TimeUnit import javax.inject.Inject import javax.inject.Named /** * Fragment displaying speaker details and their events. */ @AndroidEntryPoint class SpeakerFragment : Fragment(), OnOffsetChangedListener { @Inject lateinit var snackbarMessageManager: SnackbarMessageManager @Inject lateinit var analyticsHelper: AnalyticsHelper @Inject @Named("tagViewPool") lateinit var tagRecycledViewPool: RecycledViewPool private val speakerViewModel: SpeakerViewModel by viewModels() private val scheduleTwoPaneViewModel: ScheduleTwoPaneViewModel by activityViewModels() private lateinit var binding: FragmentSpeakerBinding private var toolbarCollapsed = false override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View { sharedElementEnterTransition = TransitionInflater.from(requireContext()) .inflateTransition(R.transition.speaker_shared_enter) // Delay the enter transition until speaker image has loaded. postponeEnterTransition(500L, TimeUnit.MILLISECONDS) val imageLoadListener = object : ImageLoadListener { override fun onImageLoaded() { startPostponedEnterTransition() } override fun onImageLoadFailed() { startPostponedEnterTransition() } } val themedInflater = inflater.cloneInContext(ContextThemeWrapper(requireActivity(), R.style.AppTheme_Detail)) binding = FragmentSpeakerBinding.inflate(themedInflater, container, false).apply { lifecycleOwner = viewLifecycleOwner headshotLoadListener = imageLoadListener viewModel = speakerViewModel } val speakerAdapter = SpeakerAdapter( viewLifecycleOwner, speakerViewModel, scheduleTwoPaneViewModel, tagRecycledViewPool ) binding.speakerDetailRecyclerView.run { adapter = speakerAdapter itemAnimator?.run { addDuration = 120L moveDuration = 120L changeDuration = 120L removeDuration = 100L } doOnApplyWindowInsets { view, insets, padding -> val systemInsets = insets.getInsets( WindowInsetsCompat.Type.systemBars() or WindowInsetsCompat.Type.ime() ) view.updatePadding(bottom = padding.bottom + systemInsets.bottom) // CollapsingToolbarLayout's default scrim visible trigger height is a bit large. // Choose something smaller so that the content stays visible longer. binding.collapsingToolbar.scrimVisibleHeightTrigger = systemInsets.top * 2 } doOnNextLayout { setContentMaxWidth(this) } } binding.toolbar.setNavigationOnClickListener { findNavController().navigateUp() } return binding.root } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) launchAndRepeatWithViewLifecycle { launch { speakerViewModel.speaker.collect { if (it != null) { val pageName = "Speaker Details: ${it.name}" analyticsHelper.sendScreenView(pageName, requireActivity()) } } } launch { speakerViewModel.speakerUserSessions.collect { (binding.speakerDetailRecyclerView.adapter as SpeakerAdapter) .speakerSessions = it } } // If speaker does not have a profile image to load, we need to resume. launch { speakerViewModel.hasNoProfileImage.collect { if (it) { startPostponedEnterTransition() } } } } } override fun onOffsetChanged(appBarLayout: AppBarLayout, verticalOffset: Int) { val collapsed = (-verticalOffset >= appBarLayout.totalScrollRange) if (collapsed != toolbarCollapsed) { toolbarCollapsed = collapsed // We have transparent status bar, so we don't use CollapsingToolbarLayout's // statusBarScrim. Instead fade out the views when collapsed. val alpha = if (collapsed) 0f else 1f binding.toolbar.animate().alpha(alpha).start() binding.speakerImage.animate().alpha(alpha).start() } } } ================================================ FILE: mobile/src/main/java/com/google/samples/apps/iosched/ui/speaker/SpeakerViewModel.kt ================================================ /* * Copyright 2018 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.ui.speaker import androidx.lifecycle.SavedStateHandle import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.google.samples.apps.iosched.model.Speaker import com.google.samples.apps.iosched.model.SpeakerId import com.google.samples.apps.iosched.model.userdata.UserSession import com.google.samples.apps.iosched.shared.domain.sessions.LoadUserSessionsUseCase import com.google.samples.apps.iosched.shared.domain.settings.GetTimeZoneUseCase import com.google.samples.apps.iosched.shared.domain.speakers.LoadSpeakerUseCase import com.google.samples.apps.iosched.shared.domain.speakers.LoadSpeakerUseCaseResult import com.google.samples.apps.iosched.shared.result.Result import com.google.samples.apps.iosched.shared.result.Result.Loading import com.google.samples.apps.iosched.shared.result.data import com.google.samples.apps.iosched.shared.result.successOr import com.google.samples.apps.iosched.shared.util.TimeUtils import com.google.samples.apps.iosched.ui.sessioncommon.OnSessionStarClickDelegate import com.google.samples.apps.iosched.ui.signin.SignInViewModelDelegate import com.google.samples.apps.iosched.util.WhileViewSubscribed import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.collect import kotlinx.coroutines.flow.flow import kotlinx.coroutines.flow.mapLatest import kotlinx.coroutines.flow.stateIn import kotlinx.coroutines.flow.transformLatest import org.threeten.bp.ZoneId import javax.inject.Inject /** * Loads a [Speaker] and their sessions, handles event actions. */ @HiltViewModel class SpeakerViewModel @Inject constructor( savedStateHandle: SavedStateHandle, private val loadSpeakerUseCase: LoadSpeakerUseCase, private val loadSpeakerSessionsUseCase: LoadUserSessionsUseCase, getTimeZoneUseCase: GetTimeZoneUseCase, signInViewModelDelegate: SignInViewModelDelegate, private val onSessionStarClickDelegate: OnSessionStarClickDelegate ) : ViewModel(), SignInViewModelDelegate by signInViewModelDelegate, OnSessionStarClickDelegate by onSessionStarClickDelegate { // TODO: remove hardcoded string when https://issuetracker.google.com/136967621 is available private val speakerId: SpeakerId? = savedStateHandle.get("speaker_id") private val loadSpeakerUseCaseResult: StateFlow> = flow { speakerId?.let { emit(loadSpeakerUseCase(speakerId)) } }.stateIn(viewModelScope, SharingStarted.Eagerly, Loading) val speakerUserSessions: StateFlow> = loadSpeakerUseCaseResult.transformLatest { speaker -> speaker.data?.let { loadSpeakerSessionsUseCase(it.speaker.id to it.sessionIds).collect { it.data?.let { data -> emit(data) } } } }.stateIn(viewModelScope, WhileViewSubscribed, emptyList()) val speaker: StateFlow = loadSpeakerUseCaseResult.mapLatest { it.data?.speaker }.stateIn(viewModelScope, WhileViewSubscribed, null) val hasNoProfileImage: StateFlow = loadSpeakerUseCaseResult.mapLatest { it.data?.speaker?.imageUrl.isNullOrEmpty() }.stateIn(viewModelScope, WhileViewSubscribed, true) // Exposed to the view as a StateFlow but it's a one-shot operation. val timeZoneId = flow { if (getTimeZoneUseCase(Unit).successOr(true)) { emit(TimeUtils.CONFERENCE_TIMEZONE) } else { emit(ZoneId.systemDefault()) } }.stateIn(viewModelScope, SharingStarted.Lazily, TimeUtils.CONFERENCE_TIMEZONE) } ================================================ FILE: mobile/src/main/java/com/google/samples/apps/iosched/ui/theme/ThemeViewModel.kt ================================================ /* * Copyright 2019 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.ui.theme import androidx.lifecycle.ViewModel import dagger.hilt.android.lifecycle.HiltViewModel import javax.inject.Inject /** * Thin ViewModel for themed Activities that don't have another ViewModel to use with * [ThemedActivityDelegate]. */ @HiltViewModel class ThemeViewModel @Inject constructor( themedActivityDelegate: ThemedActivityDelegate ) : ViewModel(), ThemedActivityDelegate by themedActivityDelegate ================================================ FILE: mobile/src/main/java/com/google/samples/apps/iosched/ui/theme/ThemedActivityDelegate.kt ================================================ /* * Copyright 2019 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.ui.theme import com.google.samples.apps.iosched.model.Theme import com.google.samples.apps.iosched.shared.di.ApplicationScope import com.google.samples.apps.iosched.shared.domain.settings.GetThemeUseCase import com.google.samples.apps.iosched.shared.domain.settings.ObserveThemeModeUseCase import com.google.samples.apps.iosched.shared.result.Result.Success import com.google.samples.apps.iosched.shared.result.successOr import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.stateIn import kotlinx.coroutines.runBlocking import javax.inject.Inject /** * Interface to implement activity theming via a ViewModel. * * You can inject a implementation of this via Dagger2, then use the implementation as an interface * delegate to add the functionality without writing any code * * Example usage: * ``` * class MyViewModel @Inject constructor( * themedActivityDelegate: ThemedActivityDelegate * ) : ViewModel(), ThemedActivityDelegate by themedActivityDelegate { * ``` */ interface ThemedActivityDelegate { /** * Allows observing of the current theme */ val theme: StateFlow /** * Allows querying of the current theme synchronously */ val currentTheme: Theme } class ThemedActivityDelegateImpl @Inject constructor( @ApplicationScope externalScope: CoroutineScope, observeThemeUseCase: ObserveThemeModeUseCase, private val getThemeUseCase: GetThemeUseCase ) : ThemedActivityDelegate { override val theme: StateFlow = observeThemeUseCase(Unit).map { it.successOr(Theme.SYSTEM) }.stateIn(externalScope, SharingStarted.Eagerly, Theme.SYSTEM) override val currentTheme: Theme get() = runBlocking { // Using runBlocking to execute this coroutine synchronously getThemeUseCase(Unit).let { if (it is Success) it.data else Theme.SYSTEM } } } ================================================ FILE: mobile/src/main/java/com/google/samples/apps/iosched/ui/theme/ThemedActivityDelegateModule.kt ================================================ /* * Copyright 2019 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.ui.theme import dagger.Binds import dagger.Module import dagger.hilt.InstallIn import dagger.hilt.components.SingletonComponent import javax.inject.Singleton @InstallIn(SingletonComponent::class) @Module @Suppress("UNUSED") abstract class ThemedActivityDelegateModule { @Singleton @Binds abstract fun provideThemedActivityDelegate( impl: ThemedActivityDelegateImpl ): ThemedActivityDelegate } ================================================ FILE: mobile/src/main/java/com/google/samples/apps/iosched/util/CircularOutlineProvider.kt ================================================ /* * Copyright 2018 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.util import android.graphics.Outline import android.view.View import android.view.ViewOutlineProvider object CircularOutlineProvider : ViewOutlineProvider() { override fun getOutline(view: View, outline: Outline) { outline.setOval( view.paddingLeft, view.paddingTop, view.width - view.paddingRight, view.height - view.paddingBottom ) } } ================================================ FILE: mobile/src/main/java/com/google/samples/apps/iosched/util/CrashlyticsTree.kt ================================================ /* * Copyright 2018 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.util import android.util.Log import com.google.firebase.crashlytics.FirebaseCrashlytics import timber.log.Timber class CrashlyticsTree : Timber.Tree() { override fun log(priority: Int, tag: String?, message: String, t: Throwable?) { if (priority == Log.VERBOSE || priority == Log.DEBUG || priority == Log.INFO) { return } val crashlytics = FirebaseCrashlytics.getInstance() crashlytics.setCustomKey(CRASHLYTICS_KEY_PRIORITY, priority) crashlytics.setCustomKey(CRASHLYTICS_KEY_TAG, tag ?: "") crashlytics.setCustomKey(CRASHLYTICS_KEY_MESSAGE, message) if (t == null) { crashlytics.recordException(Exception(message)) } else { crashlytics.recordException(t) } } companion object { private const val CRASHLYTICS_KEY_PRIORITY = "priority" private const val CRASHLYTICS_KEY_TAG = "tag" private const val CRASHLYTICS_KEY_MESSAGE = "message" } } ================================================ FILE: mobile/src/main/java/com/google/samples/apps/iosched/util/Extensions.kt ================================================ /* * Copyright 2018 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.util import android.annotation.SuppressLint import android.content.Context import android.content.res.Resources import android.content.res.TypedArray import android.graphics.Typeface import android.net.wifi.WifiConfiguration import android.os.Build import android.text.Layout.Alignment import android.text.Spannable import android.text.SpannableString import android.text.Spanned import android.text.StaticLayout import android.text.TextPaint import android.text.style.StyleSpan import android.util.TypedValue import android.view.View import android.view.View.OnAttachStateChangeListener import androidx.annotation.ColorInt import androidx.annotation.DimenRes import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatDelegate import androidx.core.content.res.ResourcesCompat import androidx.core.os.BuildCompat import androidx.core.view.ViewCompat import androidx.core.view.WindowInsetsCompat import androidx.databinding.ObservableBoolean import androidx.databinding.ViewDataBinding import androidx.drawerlayout.widget.DrawerLayout import androidx.lifecycle.LiveData import androidx.lifecycle.MediatorLiveData import com.google.samples.apps.iosched.model.Theme fun ObservableBoolean.hasSameValue(other: ObservableBoolean) = get() == other.get() fun Int.isEven() = this % 2 == 0 fun View.isRtl() = layoutDirection == View.LAYOUT_DIRECTION_RTL inline fun T.executeAfter(block: T.() -> Unit) { block() executePendingBindings() } /** * Calculated the widest line in a [StaticLayout]. */ fun StaticLayout.textWidth(): Int { var width = 0f for (i in 0 until lineCount) { width = width.coerceAtLeast(getLineWidth(i)) } return width.toInt() } fun newStaticLayout( source: CharSequence, paint: TextPaint, width: Int, alignment: Alignment, spacingmult: Float, spacingadd: Float, includepad: Boolean ): StaticLayout { return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { StaticLayout.Builder.obtain(source, 0, source.length, paint, width).apply { setAlignment(alignment) setLineSpacing(spacingadd, spacingmult) setIncludePad(includepad) }.build() } else { @Suppress("DEPRECATION") StaticLayout(source, paint, width, alignment, spacingmult, spacingadd, includepad) } } /** * Linearly interpolate between two values. */ fun lerp(a: Float, b: Float, t: Float): Float { return a + (b - a) * t } /** * Alternative to Resources.getDimension() for values that are TYPE_FLOAT. */ fun Resources.getFloatUsingCompat(@DimenRes resId: Int): Float { return ResourcesCompat.getFloat(this, resId) } /** * Return the Wifi config wrapped in quotes. */ fun WifiConfiguration.quoteSsidAndPassword(): WifiConfiguration { return WifiConfiguration().apply { SSID = this@quoteSsidAndPassword.SSID.wrapInQuotes() preSharedKey = this@quoteSsidAndPassword.preSharedKey.wrapInQuotes() } } /** * Return the Wifi config without quotes. */ fun WifiConfiguration.unquoteSsidAndPassword(): WifiConfiguration { return WifiConfiguration().apply { SSID = this@unquoteSsidAndPassword.SSID.unwrapQuotes() preSharedKey = this@unquoteSsidAndPassword.preSharedKey.unwrapQuotes() } } fun String.wrapInQuotes(): String { var formattedConfigString: String = this if (!startsWith("\"")) { formattedConfigString = "\"$formattedConfigString" } if (!endsWith("\"")) { formattedConfigString = "$formattedConfigString\"" } return formattedConfigString } fun String.unwrapQuotes(): String { var formattedConfigString: String = this if (formattedConfigString.startsWith("\"")) { if (formattedConfigString.length > 1) { formattedConfigString = formattedConfigString.substring(1) } else { formattedConfigString = "" } } if (formattedConfigString.endsWith("\"")) { if (formattedConfigString.length > 1) { formattedConfigString = formattedConfigString.substring(0, formattedConfigString.length - 1) } else { formattedConfigString = "" } } return formattedConfigString } /** Make the first instance of [boldText] in a CharSequece bold. */ fun CharSequence.makeBold(boldText: String): CharSequence { val start = indexOf(boldText) val end = start + boldText.length val span = StyleSpan(Typeface.BOLD) return if (this is Spannable) { setSpan(span, start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE) this } else { SpannableString(this).apply { setSpan(span, start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE) } } } /** * Having to suppress lint. Bug raised: 128789886 */ @SuppressLint("WrongConstant") fun AppCompatActivity.updateForTheme(theme: Theme) = when (theme) { Theme.DARK -> delegate.localNightMode = AppCompatDelegate.MODE_NIGHT_YES Theme.LIGHT -> delegate.localNightMode = AppCompatDelegate.MODE_NIGHT_NO Theme.SYSTEM -> delegate.localNightMode = AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM Theme.BATTERY_SAVER -> delegate.localNightMode = AppCompatDelegate.MODE_NIGHT_AUTO_BATTERY } /** * Combines this [LiveData] with another [LiveData] using the specified [combiner] and returns the * result as a [LiveData]. */ fun LiveData.combine( other: LiveData, combiner: (A, B) -> Result ): LiveData { val result = MediatorLiveData() result.addSource(this) { a -> val b = other.value if (b != null) { result.postValue(combiner(a, b)) } } result.addSource(other) { b -> val a = this@combine.value if (a != null) { result.postValue(combiner(a, b)) } } return result } /** * Combines this [LiveData] with other two [LiveData]s using the specified [combiner] and returns * the result as a [LiveData]. */ fun LiveData.combine( other1: LiveData, other2: LiveData, combiner: (A, B, C) -> Result ): LiveData { val result = MediatorLiveData() result.addSource(this) { a -> val b = other1.value val c = other2.value if (b != null && c != null) { result.postValue(combiner(a, b, c)) } } result.addSource(other1) { b -> val a = this@combine.value val c = other2.value if (a != null && c != null) { result.postValue(combiner(a, b, c)) } } result.addSource(other2) { c -> val a = this@combine.value val b = other1.value if (a != null && b != null) { result.postValue(combiner(a, b, c)) } } return result } fun View.doOnApplyWindowInsets(f: (View, WindowInsetsCompat, ViewPaddingState) -> Unit) { // Create a snapshot of the view's padding state val paddingState = createStateForView(this) ViewCompat.setOnApplyWindowInsetsListener(this) { v, insets -> f(v, insets, paddingState) insets } requestApplyInsetsWhenAttached() } /** * Call [View.requestApplyInsets] in a safe away. If we're attached it calls it straight-away. * If not it sets an [View.OnAttachStateChangeListener] and waits to be attached before calling * [View.requestApplyInsets]. */ fun View.requestApplyInsetsWhenAttached() { if (isAttachedToWindow) { requestApplyInsets() } else { addOnAttachStateChangeListener(object : OnAttachStateChangeListener { override fun onViewAttachedToWindow(v: View) { v.requestApplyInsets() } override fun onViewDetachedFromWindow(v: View) = Unit }) } } private fun createStateForView(view: View) = ViewPaddingState( view.paddingLeft, view.paddingTop, view.paddingRight, view.paddingBottom, view.paddingStart, view.paddingEnd ) data class ViewPaddingState( val left: Int, val top: Int, val right: Int, val bottom: Int, val start: Int, val end: Int ) @SuppressLint("NewApi") // Lint does not understand isAtLeastQ currently fun DrawerLayout.shouldCloseDrawerFromBackPress(): Boolean { if (BuildCompat.isAtLeastQ()) { // If we're running on Q, and this call to closeDrawers is from a key event // (for back handling), we should only honor it IF the device is not currently // in gesture mode. We approximate that by checking the system gesture insets return rootWindowInsets?.let { val systemGestureInsets = it.systemGestureInsets return systemGestureInsets.left == 0 && systemGestureInsets.right == 0 } ?: false } // On P and earlier, always close the drawer return true } /** Compatibility removeIf since it was added in API 24 */ fun MutableCollection.compatRemoveIf(predicate: (T) -> Boolean): Boolean { val it = iterator() var removed = false while (it.hasNext()) { if (predicate(it.next())) { it.remove() removed = true } } return removed } /** Reads the color attribute from the theme for given [colorAttributeId] */ fun Context.getColorFromTheme(colorAttributeId: Int): Int { val typedValue = TypedValue() val typedArray: TypedArray = this.obtainStyledAttributes( typedValue.data, intArrayOf(colorAttributeId) ) @ColorInt val color = typedArray.getColor(0, 0) typedArray.recycle() return color } ================================================ FILE: mobile/src/main/java/com/google/samples/apps/iosched/util/FirebaseAnalyticsHelper.kt ================================================ /* * Copyright 2019 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.util import android.app.Activity import com.google.firebase.analytics.FirebaseAnalytics import com.google.firebase.analytics.ktx.analytics import com.google.firebase.analytics.ktx.logEvent import com.google.firebase.ktx.Firebase import com.google.samples.apps.iosched.shared.analytics.AnalyticsActions import com.google.samples.apps.iosched.shared.analytics.AnalyticsHelper import com.google.samples.apps.iosched.shared.data.prefs.DataStorePreferenceStorage.PreferencesKeys.PREF_CODELABS_INFO_SHOWN import com.google.samples.apps.iosched.shared.data.prefs.DataStorePreferenceStorage.PreferencesKeys.PREF_CONFERENCE_TIME_ZONE import com.google.samples.apps.iosched.shared.data.prefs.DataStorePreferenceStorage.PreferencesKeys.PREF_MY_LOCATION_OPTED_IN import com.google.samples.apps.iosched.shared.data.prefs.DataStorePreferenceStorage.PreferencesKeys.PREF_NOTIFICATIONS_SHOWN import com.google.samples.apps.iosched.shared.data.prefs.DataStorePreferenceStorage.PreferencesKeys.PREF_ONBOARDING import com.google.samples.apps.iosched.shared.data.prefs.DataStorePreferenceStorage.PreferencesKeys.PREF_RECEIVE_NOTIFICATIONS import com.google.samples.apps.iosched.shared.data.prefs.DataStorePreferenceStorage.PreferencesKeys.PREF_SEND_USAGE_STATISTICS import com.google.samples.apps.iosched.shared.data.prefs.PreferenceStorage import com.google.samples.apps.iosched.shared.di.ApplicationScope import com.google.samples.apps.iosched.ui.signin.SignInViewModelDelegate import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.collect import kotlinx.coroutines.flow.flattenMerge import kotlinx.coroutines.flow.flowOf import kotlinx.coroutines.flow.map import kotlinx.coroutines.launch import timber.log.Timber /** * Firebase Analytics implementation of AnalyticsHelper */ class FirebaseAnalyticsHelper( @ApplicationScope private val externalScope: CoroutineScope, signInViewModelDelegate: SignInViewModelDelegate, private val preferenceStorage: PreferenceStorage ) : AnalyticsHelper { private var firebaseAnalytics = Firebase.analytics private var analyticsEnabled: Flow = preferenceStorage.sendUsageStatistics /** * Initialize Analytics tracker. If the user has permitted tracking and has already signed TOS, * (possible except on first run), initialize analytics Immediately. */ init { externalScope.launch { // Prevent access to preferences on main thread analyticsEnabled.collect { Timber.d("Setting Analytics enabled: $it") firebaseAnalytics.setAnalyticsCollectionEnabled(it) } // The listener will initialize Analytics when the TOS is signed, or enable/disable // Analytics based on the "anonymous data collection" setting. logSendUsageStatsFlagChanges() } externalScope.launch { // The listener will initialize Analytics when the TOS is signed, or enable/disable // Analytics based on the "anonymous data collection" setting. logSendUsageStatsFlagChanges() } externalScope.launch { signInViewModelDelegate.isUserSignedIn.collect { signedIn -> setUserSignedIn(signedIn) Timber.d("Updated user signed in to $signedIn") } } externalScope.launch { signInViewModelDelegate.isUserRegistered.collect { registered -> setUserRegistered(registered) Timber.d("Updated user registered to $registered") } } } override fun sendScreenView(screenName: String, activity: Activity) { firebaseAnalytics.run { setCurrentScreen(activity, screenName, null) logEvent(FirebaseAnalytics.Event.SELECT_ITEM) { param(FirebaseAnalytics.Param.ITEM_ID, screenName) param(FirebaseAnalytics.Param.CONTENT_TYPE, FA_CONTENT_TYPE_SCREENVIEW) } Timber.d("Screen View recorded: $screenName") } } override fun logUiEvent(itemId: String, action: String) { firebaseAnalytics.logEvent(FirebaseAnalytics.Event.SELECT_ITEM) { param(FirebaseAnalytics.Param.ITEM_ID, itemId) param(FirebaseAnalytics.Param.CONTENT_TYPE, FA_CONTENT_TYPE_UI_EVENT) param(FA_KEY_UI_ACTION, action) } Timber.d("Event recorded for $itemId, $action") } override fun setUserSignedIn(isSignedIn: Boolean) { // todo(alexlucas) : Set up user properties in both dev and prod firebaseAnalytics.setUserProperty(UPROP_USER_SIGNED_IN, isSignedIn.toString()) } override fun setUserRegistered(isRegistered: Boolean) { // todo(alexlucas) : Set up user properties in both dev and prod firebaseAnalytics.setUserProperty(UPROP_USER_REGISTERED, isRegistered.toString()) } /** * Set up a listener for preference changes. */ private suspend fun logSendUsageStatsFlagChanges() { // not logged: showScheduleUiHints, selectedFilters, selectedTheme flowOf( preferenceStorage.codelabsInfoShown.map { PREF_CODELABS_INFO_SHOWN.name to it }, preferenceStorage.myLocationOptedIn.map { PREF_MY_LOCATION_OPTED_IN.name to it }, preferenceStorage.notificationsPreferenceShown.map { PREF_NOTIFICATIONS_SHOWN.name to it }, preferenceStorage.onboardingCompleted.map { PREF_ONBOARDING.name to it }, preferenceStorage.preferConferenceTimeZone.map { PREF_CONFERENCE_TIME_ZONE.name to it }, preferenceStorage.preferToReceiveNotifications.map { PREF_RECEIVE_NOTIFICATIONS.name to it }, preferenceStorage.sendUsageStatistics.map { PREF_SEND_USAGE_STATISTICS.name to it } ).flattenMerge().collect { (key, value) -> val action = if (value) AnalyticsActions.ENABLE else AnalyticsActions.DISABLE logUiEvent("Preference: $key", action) } } companion object { private const val UPROP_USER_SIGNED_IN = "user_signed_in" private const val UPROP_USER_REGISTERED = "user_registered" /** * Log a specific screen view under the `screenName` string. */ private const val FA_CONTENT_TYPE_SCREENVIEW = "screen" private const val FA_KEY_UI_ACTION = "ui_action" private const val FA_CONTENT_TYPE_UI_EVENT = "ui event" } } ================================================ FILE: mobile/src/main/java/com/google/samples/apps/iosched/util/GlideTargets.kt ================================================ /* * Copyright 2019 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.util import android.graphics.drawable.Drawable import android.view.MenuItem import com.bumptech.glide.request.target.BaseTarget import com.bumptech.glide.request.target.SizeReadyCallback import com.bumptech.glide.request.target.Target import com.bumptech.glide.request.transition.Transition fun MenuItem.asGlideTarget(size: Int): Target = object : BaseTarget() { override fun getSize(cb: SizeReadyCallback) { cb.onSizeReady(size, size) } override fun removeCallback(cb: SizeReadyCallback) {} override fun onLoadStarted(placeholder: Drawable?) { icon = placeholder } override fun onLoadFailed(errorDrawable: Drawable?) { icon = errorDrawable } override fun onLoadCleared(placeholder: Drawable?) { icon = placeholder } override fun onResourceReady(resource: Drawable, transition: Transition?) { icon = resource } } ================================================ FILE: mobile/src/main/java/com/google/samples/apps/iosched/util/NavigationBarScrimBehavior.kt ================================================ /* * Copyright 2019 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.util import android.content.Context import android.util.AttributeSet import android.view.View import androidx.annotation.Keep import androidx.coordinatorlayout.widget.CoordinatorLayout import androidx.core.view.WindowInsetsCompat import com.google.android.material.bottomappbar.BottomAppBar @Keep @Suppress("UNUSED") class NavigationBarScrimBehavior( context: Context, attrs: AttributeSet ) : CoordinatorLayout.Behavior(context, attrs) { override fun onLayoutChild( parent: CoordinatorLayout, child: View, layoutDirection: Int ): Boolean { child.setOnApplyWindowInsetsListener(NoopWindowInsetsListener) // Return false so that the child is laid out by the parent return false } override fun layoutDependsOn( parent: CoordinatorLayout, child: View, dependency: View ): Boolean { if (dependency is BottomAppBar) { // Copy over the elevation value child.elevation = dependency.elevation return true } return false } override fun onDependentViewChanged( parent: CoordinatorLayout, child: View, dependency: View ): Boolean { child.elevation = dependency.elevation return false } override fun onApplyWindowInsets( parent: CoordinatorLayout, child: View, insets: WindowInsetsCompat ): WindowInsetsCompat { child.layoutParams.height = insets.systemWindowInsetBottom child.requestLayout() return insets } } ================================================ FILE: mobile/src/main/java/com/google/samples/apps/iosched/util/RecyclerViewExtensions.kt ================================================ /* * Copyright 2018 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.util import androidx.recyclerview.widget.RecyclerView fun RecyclerView.clearDecorations() { if (itemDecorationCount > 0) { for (i in itemDecorationCount - 1 downTo 0) { removeItemDecorationAt(i) } } } ================================================ FILE: mobile/src/main/java/com/google/samples/apps/iosched/util/SharingStartedViews.kt ================================================ /* * Copyright 2021 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.util import kotlinx.coroutines.flow.SharingStarted private const val StopTimeoutMillis: Long = 5000 /** * A [SharingStarted] meant to be used with a [StateFlow] to expose data to a view. * * When the view stops observing, upstream flows stay active for some time to allow the system to * come back from a short-lived configuration change (such as rotations). If the view stops * observing for longer, the cache is kept but the upstream flows are stopped. When the view comes * back, the latest value is replayed and the upstream flows are executed again. This is done to * save resources when the app is in the background but let users switch between apps quickly. */ val WhileViewSubscribed: SharingStarted = SharingStarted.WhileSubscribed(StopTimeoutMillis) ================================================ FILE: mobile/src/main/java/com/google/samples/apps/iosched/util/StatusBarScrimBehavior.kt ================================================ /* * Copyright 2019 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.util import android.content.Context import android.util.AttributeSet import android.view.View import androidx.annotation.Keep import androidx.coordinatorlayout.widget.CoordinatorLayout import androidx.core.view.WindowInsetsCompat import com.google.android.material.appbar.AppBarLayout @Keep @Suppress("UNUSED") class StatusBarScrimBehavior( context: Context, attrs: AttributeSet ) : CoordinatorLayout.Behavior(context, attrs) { override fun onLayoutChild( parent: CoordinatorLayout, child: View, layoutDirection: Int ): Boolean { child.setOnApplyWindowInsetsListener(NoopWindowInsetsListener) // Return false so that the child is laid out by the parent return false } override fun layoutDependsOn( parent: CoordinatorLayout, child: View, dependency: View ): Boolean { if (dependency is AppBarLayout) { // Jump the drawable state in case the elevation is animating dependency.jumpDrawablesToCurrentState() // Copy over the elevation value child.elevation = dependency.elevation return true } return false } override fun onDependentViewChanged( parent: CoordinatorLayout, child: View, dependency: View ): Boolean { child.elevation = dependency.elevation return false } override fun onApplyWindowInsets( parent: CoordinatorLayout, child: View, insets: WindowInsetsCompat ): WindowInsetsCompat { child.layoutParams.height = insets.systemWindowInsetTop child.requestLayout() return insets } } ================================================ FILE: mobile/src/main/java/com/google/samples/apps/iosched/util/UiUtils.kt ================================================ /* * Copyright 2019 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.util import android.content.Context import android.graphics.drawable.Drawable import android.view.View import androidx.appcompat.content.res.AppCompatResources import androidx.constraintlayout.widget.ConstraintLayout import androidx.core.graphics.drawable.DrawableCompat import androidx.fragment.app.Fragment import androidx.lifecycle.Lifecycle import androidx.lifecycle.lifecycleScope import androidx.lifecycle.repeatOnLifecycle import com.google.samples.apps.iosched.R import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.launch fun navigationItemBackground(context: Context): Drawable? { // Need to inflate the drawable and CSL via AppCompatResources to work on Lollipop var background = AppCompatResources.getDrawable(context, R.drawable.navigation_item_background) if (background != null) { val tint = AppCompatResources.getColorStateList( context, R.color.navigation_item_background_tint ) background = DrawableCompat.wrap(background.mutate()) background.setTintList(tint) } return background } /** * Map a slideOffset (in the range `[-1, 1]`) to an alpha value based on the desired range. * For example, `slideOffsetToAlpha(0.5, 0.25, 1) = 0.33` because 0.5 is 1/3 of the way between * 0.25 and 1. The result value is additionally clamped to the range `[0, 1]`. */ fun slideOffsetToAlpha(value: Float, rangeMin: Float, rangeMax: Float): Float { return ((value - rangeMin) / (rangeMax - rangeMin)).coerceIn(0f, 1f) } /** * Launches a new coroutine and repeats `block` every time the Fragment's viewLifecycleOwner * is in and out of `minActiveState` lifecycle state. */ inline fun Fragment.launchAndRepeatWithViewLifecycle( minActiveState: Lifecycle.State = Lifecycle.State.STARTED, crossinline block: suspend CoroutineScope.() -> Unit ) { viewLifecycleOwner.lifecycleScope.launch { viewLifecycleOwner.lifecycle.repeatOnLifecycle(minActiveState) { block() } } } /** * Set the maximum width the view should take as a percent of its parent. The view must a direct * child of a ConstraintLayout. */ fun setContentMaxWidth(view: View) { val parent = view.parent as? ConstraintLayout ?: return val layoutParams = view.layoutParams as ConstraintLayout.LayoutParams val screenDensity = view.resources.displayMetrics.density val widthDp = parent.width / screenDensity val widthPercent = getContextMaxWidthPercent(widthDp.toInt()) layoutParams.matchConstraintPercentWidth = widthPercent view.requestLayout() } private fun getContextMaxWidthPercent(maxWidthDp: Int): Float { // These match @dimen/content_max_width_percent. return when { maxWidthDp >= 1024 -> 0.6f maxWidthDp >= 840 -> 0.7f maxWidthDp >= 600 -> 0.8f else -> 1f } } ================================================ FILE: mobile/src/main/java/com/google/samples/apps/iosched/util/ViewBindingAdapters.kt ================================================ /* * Copyright 2018 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.util import android.content.Context import android.content.Intent import android.graphics.drawable.Drawable import android.net.Uri import android.view.View import android.view.View.GONE import android.view.View.VISIBLE import android.widget.ImageView import android.widget.TextView import androidx.annotation.StringRes import androidx.browser.customtabs.CustomTabsIntent import androidx.browser.customtabs.CustomTabsService import androidx.core.net.toUri import androidx.core.view.isVisible import androidx.databinding.BindingAdapter import androidx.recyclerview.widget.RecyclerView import androidx.viewpager2.widget.MarginPageTransformer import androidx.viewpager2.widget.ViewPager2 import com.bumptech.glide.Glide import com.bumptech.glide.request.RequestOptions import com.google.android.material.color.MaterialColors import com.google.android.material.floatingactionbutton.FloatingActionButton import com.google.samples.apps.iosched.R import com.google.samples.apps.iosched.model.Theme import com.google.samples.apps.iosched.model.Theme.DARK import com.google.samples.apps.iosched.widget.CustomSwipeRefreshLayout import com.google.samples.apps.iosched.widget.SpaceDecoration import timber.log.Timber @BindingAdapter("goneUnless") fun goneUnless(view: View, visible: Boolean) { view.visibility = if (visible) VISIBLE else GONE } @BindingAdapter("fabVisibility") fun fabVisibility(fab: FloatingActionButton, visible: Boolean) { if (visible) fab.show() else fab.hide() } @BindingAdapter("pageMargin") fun pageMargin(viewPager: ViewPager2, pageMargin: Float) { viewPager.setPageTransformer(MarginPageTransformer(pageMargin.toInt())) } @BindingAdapter("clipToCircle") fun clipToCircle(view: View, clip: Boolean) { view.clipToOutline = clip view.outlineProvider = if (clip) CircularOutlineProvider else null } @BindingAdapter( value = [ "momentImageUrl", "momentImageUrlDarkTheme", "momentTheme" ], requireAll = false ) fun momentImageUrl( imageView: ImageView, momentImageUrl: String?, momentImageUrlDarkTheme: String?, momentTheme: Theme? ) { when (momentTheme) { DARK -> imageUri(imageView, momentImageUrlDarkTheme?.toUri(), null) else -> imageUri(imageView, momentImageUrl?.toUri(), null) } } @BindingAdapter(value = ["imageUri", "placeholder"], requireAll = false) fun imageUri(imageView: ImageView, imageUri: Uri?, placeholder: Drawable?) { when (imageUri) { null -> { Timber.d("Unsetting image url") Glide.with(imageView) .load(placeholder) .into(imageView) } else -> { Glide.with(imageView) .load(imageUri) .apply(RequestOptions().placeholder(placeholder)) .into(imageView) } } } @BindingAdapter(value = ["imageUrl", "placeholder"], requireAll = false) fun imageUrl(imageView: ImageView, imageUrl: String?, placeholder: Drawable?) { imageUri(imageView, imageUrl?.toUri(), placeholder) } /** * Sets the colors of the [CustomSwipeRefreshLayout] loading indicator. */ @BindingAdapter("swipeRefreshColors") fun setSwipeRefreshColors(swipeRefreshLayout: CustomSwipeRefreshLayout, colorResIds: IntArray) { swipeRefreshLayout.setColorSchemeColors(*colorResIds) } /** Set text on a [TextView] from a string resource. */ @BindingAdapter("android:text") fun setText(view: TextView, @StringRes resId: Int) { if (resId == 0) { view.text = null } else { view.setText(resId) } } @BindingAdapter("itemSpacing") fun itemSpacing(view: RecyclerView, dimen: Float) { val space = dimen.toInt() if (space > 0) { view.addItemDecoration(SpaceDecoration(space, space, space, space)) } } private const val CHROME_PACKAGE = "com.android.chrome" @BindingAdapter("websiteLink", "hideWhenEmpty", requireAll = false) fun websiteLink( button: View, url: String?, hideWhenEmpty: Boolean = false ) { if (url.isNullOrEmpty()) { if (hideWhenEmpty) { button.isVisible = false } else { button.isClickable = false } return } button.isVisible = true button.setOnClickListener { openWebsiteUrl(it.context, url) } } fun openWebsiteUrl(context: Context, url: String) { if (url.isBlank()) { return } openWebsiteUri(context, Uri.parse(url)) } fun openWebsiteUri(context: Context, uri: Uri) { if (context.isChromeCustomTabsSupported()) { CustomTabsIntent.Builder() .setToolbarColor( MaterialColors.getColor(context, R.attr.colorPrimary, null) ) .setSecondaryToolbarColor( MaterialColors.getColor(context, R.attr.colorPrimaryVariant, null) ) .build() .launchUrl(context, uri) } else { context.startActivity(Intent(Intent.ACTION_VIEW, uri)) } } private fun Context.isChromeCustomTabsSupported(): Boolean { val serviceIntent = Intent(CustomTabsService.ACTION_CUSTOM_TABS_CONNECTION) serviceIntent.setPackage(CHROME_PACKAGE) val resolveInfos = packageManager.queryIntentServices(serviceIntent, 0) return !resolveInfos.isNullOrEmpty() } ================================================ FILE: mobile/src/main/java/com/google/samples/apps/iosched/util/WindowInsetsListeners.kt ================================================ /* * Copyright 2019 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.util import android.view.View import android.view.WindowInsets object NoopWindowInsetsListener : View.OnApplyWindowInsetsListener { override fun onApplyWindowInsets(v: View, insets: WindowInsets): WindowInsets { return insets } } object HeightTopWindowInsetsListener : View.OnApplyWindowInsetsListener { override fun onApplyWindowInsets(v: View, insets: WindowInsets): WindowInsets { val topInset = insets.systemWindowInsetTop if (v.layoutParams.height != topInset) { v.layoutParams.height = topInset v.requestLayout() } return insets } } ================================================ FILE: mobile/src/main/java/com/google/samples/apps/iosched/util/initializers/AndroidThreeTenInitializer.kt ================================================ /* * Copyright 2021 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.util.initializers import android.content.Context import androidx.startup.Initializer import com.jakewharton.threetenabp.AndroidThreeTen class AndroidThreeTenInitializer : Initializer { override fun create(context: Context) { AndroidThreeTen.init(context) } override fun dependencies(): List>> = emptyList() } ================================================ FILE: mobile/src/main/java/com/google/samples/apps/iosched/util/initializers/StrictModeInitializer.kt ================================================ /* * Copyright 2021 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.util.initializers import android.content.Context import android.os.StrictMode import android.os.StrictMode.ThreadPolicy import androidx.startup.Initializer class StrictModeInitializer : Initializer { override fun create(context: Context) { StrictMode.setThreadPolicy( ThreadPolicy.Builder() .detectDiskReads() .detectDiskWrites() .detectNetwork() .penaltyLog() .build() ) } override fun dependencies(): List>> = emptyList() } ================================================ FILE: mobile/src/main/java/com/google/samples/apps/iosched/util/initializers/TimberInitializer.kt ================================================ /* * Copyright 2021 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.util.initializers import android.content.Context import androidx.startup.Initializer import com.google.samples.apps.iosched.BuildConfig import com.google.samples.apps.iosched.util.CrashlyticsTree import timber.log.Timber class TimberInitializer : Initializer { override fun create(context: Context) { if (BuildConfig.DEBUG) { Timber.plant(Timber.DebugTree()) } else { Timber.plant(CrashlyticsTree()) } } override fun dependencies(): List>> = emptyList() } ================================================ FILE: mobile/src/main/java/com/google/samples/apps/iosched/util/signin/FirebaseAuthErrorCodeConverter.kt ================================================ /* * Copyright 2018 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.util.signin import com.firebase.ui.auth.ErrorCodes import com.google.samples.apps.iosched.R import timber.log.Timber /** * Converts [ErrorCodes] from firebase to translatable strings. */ object FirebaseAuthErrorCodeConverter { fun convert(code: Int): Int { return when (code) { ErrorCodes.NO_NETWORK -> { Timber.e("FirebaseAuth error: no_network") R.string.firebase_auth_no_network_connection } ErrorCodes.DEVELOPER_ERROR -> { Timber.e("FirebaseAuth error: developer_error") R.string.firebase_auth_unknown_error } ErrorCodes.PLAY_SERVICES_UPDATE_CANCELLED -> { Timber.e("FirebaseAuth error: play_services_update_cancelled") R.string.firebase_auth_unknown_error } ErrorCodes.PROVIDER_ERROR -> { Timber.e("FirebaseAuth error: provider_error") R.string.firebase_auth_unknown_error } else -> { Timber.e("FirebaseAuth error: unknown_error") R.string.firebase_auth_unknown_error } } } } ================================================ FILE: mobile/src/main/java/com/google/samples/apps/iosched/util/signin/SignInHandler.kt ================================================ /* * Copyright 2018 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.util.signin import android.app.Activity import android.content.Context import android.content.Intent import com.firebase.ui.auth.AuthUI import com.firebase.ui.auth.IdpResponse import com.google.android.gms.auth.api.signin.GoogleSignInOptions import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.withContext /** * Element in the presentation layer that interacts with the Auth provider (Firebase in this case). * * This class is used from the activities or fragments. */ interface SignInHandler { suspend fun makeSignInIntent(): Intent fun signIn(resultCode: Int, data: Intent?, onComplete: (SignInResult) -> Unit) fun signOut(context: Context, onComplete: () -> Unit = {}) } /** * Implementation of [SignInHandler] that interacts with Firebase Auth. */ class FirebaseAuthSignInHandler(private val externalScope: CoroutineScope) : SignInHandler { /** * Request a sign in intent. * * To observe the result you must pass this to startActivityForResult. */ override suspend fun makeSignInIntent(): Intent { return withContext(externalScope.coroutineContext) { val providers = mutableListOf( AuthUI.IdpConfig.GoogleBuilder().setSignInOptions( GoogleSignInOptions.Builder() .requestId() .requestEmail() .build() ).build() ) AuthUI.getInstance() .createSignInIntentBuilder() .setAvailableProviders(providers) .build() } } /** * Parse the response from a sign in request, helper to call from onActivityResult. * * ``` * signIn(resultCode, data) { result -> * return when(result) { * is SignInSuccess -> // all good * is SignInFailed -> result?.error // access FirebaseUiException - can be null * // (e.g. canceled) * } * } * ``` * * @param resultCode activity result code * @param data activity result intent * @param onComplete pass parsed result of either [SignInSuccess] or [SignInFailed] */ @SuppressWarnings("unused") override fun signIn( resultCode: Int, data: Intent?, onComplete: (SignInResult) -> Unit ) { when (resultCode) { Activity.RESULT_OK -> onComplete(SignInSuccess) else -> onComplete(SignInFailed(IdpResponse.fromResultIntent(data)?.error)) } } /** * Attempt to sign the current user out. * * @param context any context * @param onComplete used to notify of signOut completion. */ override fun signOut(context: Context, onComplete: () -> Unit) { AuthUI.getInstance() .signOut(context) .addOnCompleteListener { onComplete() } } } ================================================ FILE: mobile/src/main/java/com/google/samples/apps/iosched/util/signin/SignInResult.kt ================================================ /* * Copyright 2018 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.util.signin import com.firebase.ui.auth.FirebaseUiException sealed class SignInResult object SignInSuccess : SignInResult() data class SignInFailed(val error: FirebaseUiException?) : SignInResult() ================================================ FILE: mobile/src/main/java/com/google/samples/apps/iosched/util/wifi/WifiInstaller.kt ================================================ /* * Copyright 2018 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.util.wifi import android.content.ClipData import android.content.ClipboardManager import android.net.wifi.WifiConfiguration import android.net.wifi.WifiManager import com.google.samples.apps.iosched.util.quoteSsidAndPassword import com.google.samples.apps.iosched.util.unquoteSsidAndPassword import javax.inject.Inject /** * Installs WiFi on device given a WiFi configuration. */ class WifiInstaller @Inject constructor( private val wifiManager: WifiManager, private val clipboardManager: ClipboardManager ) { fun installConferenceWifi(rawWifiConfig: WifiConfiguration): Boolean { val conferenceWifiConfig = rawWifiConfig.quoteSsidAndPassword() if (!wifiManager.isWifiEnabled) { wifiManager.isWifiEnabled = true } var success = false val netId = wifiManager.addNetwork(conferenceWifiConfig) if (netId != -1) { wifiManager.enableNetwork(netId, false) success = true } else { val clip: ClipData = ClipData.newPlainText( "wifi_password", conferenceWifiConfig.unquoteSsidAndPassword().preSharedKey ) clipboardManager.setPrimaryClip(clip) } return success } } ================================================ FILE: mobile/src/main/java/com/google/samples/apps/iosched/widget/BottomSheetBehavior.kt ================================================ /* * Copyright 2018 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.widget import android.annotation.SuppressLint import android.content.Context import android.os.Bundle import android.os.Parcel import android.os.Parcelable import android.util.AttributeSet import android.view.MotionEvent import android.view.VelocityTracker import android.view.View import android.view.ViewConfiguration import android.view.ViewGroup import androidx.annotation.IntDef import androidx.annotation.VisibleForTesting import androidx.coordinatorlayout.widget.CoordinatorLayout import androidx.coordinatorlayout.widget.CoordinatorLayout.Behavior import androidx.core.view.ViewCompat import androidx.customview.view.AbsSavedState import androidx.customview.widget.ViewDragHelper import com.google.samples.apps.iosched.R import com.google.samples.apps.iosched.shared.util.readBooleanUsingCompat import com.google.samples.apps.iosched.shared.util.writeBooleanUsingCompat import java.lang.ref.WeakReference import kotlin.math.absoluteValue /** * Copy of material lib's BottomSheetBehavior that includes some bug fixes. */ // TODO remove when a fixed version in material lib is released. class BottomSheetBehavior : Behavior { companion object { /** The bottom sheet is dragging. */ const val STATE_DRAGGING = 1 /** The bottom sheet is settling. */ const val STATE_SETTLING = 2 /** The bottom sheet is expanded. */ const val STATE_EXPANDED = 3 /** The bottom sheet is collapsed. */ const val STATE_COLLAPSED = 4 /** The bottom sheet is hidden. */ const val STATE_HIDDEN = 5 /** The bottom sheet is half-expanded (used when behavior_fitToContents is false). */ const val STATE_HALF_EXPANDED = 6 /** * Peek at the 16:9 ratio keyline of its parent. This can be used as a parameter for * [setPeekHeight(Int)]. [getPeekHeight()] will return this when the value is set. */ const val PEEK_HEIGHT_AUTO = -1 private const val HIDE_THRESHOLD = 0.5f private const val HIDE_FRICTION = 0.1f @IntDef( value = [ STATE_DRAGGING, STATE_SETTLING, STATE_EXPANDED, STATE_COLLAPSED, STATE_HIDDEN, STATE_HALF_EXPANDED ] ) @Retention(AnnotationRetention.SOURCE) annotation class State /** Utility to get the [BottomSheetBehavior] from a [view]. */ @JvmStatic fun from(view: View): BottomSheetBehavior<*> { val lp = view.layoutParams as? CoordinatorLayout.LayoutParams ?: throw IllegalArgumentException("view is not a child of CoordinatorLayout") return lp.behavior as? BottomSheetBehavior ?: throw IllegalArgumentException("view not associated with this behavior") } } /** Callback for monitoring events about bottom sheets. */ interface BottomSheetCallback { /** * Called when the bottom sheet changes its state. * * @param bottomSheet The bottom sheet view. * @param newState The new state. This will be one of link [STATE_DRAGGING], * [STATE_SETTLING], [STATE_EXPANDED], [STATE_COLLAPSED], [STATE_HIDDEN], or * [STATE_HALF_EXPANDED]. */ fun onStateChanged(bottomSheet: View, newState: Int) {} /** * Called when the bottom sheet is being dragged. * * @param bottomSheet The bottom sheet view. * @param slideOffset The new offset of this bottom sheet within [-1,1] range. Offset * increases as this bottom sheet is moving upward. From 0 to 1 the sheet is between * collapsed and expanded states and from -1 to 0 it is between hidden and collapsed states. */ fun onSlide(bottomSheet: View, slideOffset: Float) {} } /** The current state of the bottom sheet, backing property */ private var _state = STATE_COLLAPSED /** The current state of the bottom sheet */ @State var state get() = _state set(@State value) { if (_state == value) { return } if (viewRef == null) { // Child is not laid out yet. Set our state and let onLayoutChild() handle it later. if (value == STATE_COLLAPSED || value == STATE_EXPANDED || value == STATE_HALF_EXPANDED || (isHideable && value == STATE_HIDDEN) ) { _state = value } return } viewRef?.get()?.apply { // Start the animation; wait until a pending layout if there is one. if (parent != null && parent.isLayoutRequested && isAttachedToWindow) { post { startSettlingAnimation(this, value) } } else { startSettlingAnimation(this, value) } } } /** Whether to fit to contents. If false, the behavior will include [STATE_HALF_EXPANDED]. */ var isFitToContents = true set(value) { if (field != value) { field = value // If sheet is already laid out, recalculate the collapsed offset. // Otherwise onLayoutChild will handle this later. if (viewRef != null) { collapsedOffset = calculateCollapsedOffset() } // Fix incorrect expanded settings. setStateInternal( if (field && state == STATE_HALF_EXPANDED) STATE_EXPANDED else state ) } } /** Real peek height in pixels */ private var _peekHeight = 0 /** Peek height in pixels, or [PEEK_HEIGHT_AUTO] */ var peekHeight get() = if (peekHeightAuto) PEEK_HEIGHT_AUTO else _peekHeight set(value) { var needLayout = false if (value == PEEK_HEIGHT_AUTO) { if (!peekHeightAuto) { peekHeightAuto = true needLayout = true } } else if (peekHeightAuto || _peekHeight != value) { peekHeightAuto = false _peekHeight = Math.max(0, value) collapsedOffset = parentHeight - value needLayout = true } if (needLayout && (state == STATE_COLLAPSED || state == STATE_HIDDEN)) { viewRef?.get()?.requestLayout() } } /** Whether the bottom sheet can be hidden. */ var isHideable = false set(value) { if (field != value) { field = value if (!value && state == STATE_HIDDEN) { // Fix invalid state by moving to collapsed state = STATE_COLLAPSED } } } /** Whether the bottom sheet can be dragged or not. */ var isDraggable = true /** Whether the bottom sheet should skip collapsed state after being expanded once. */ var skipCollapsed = false /** Whether animations should be disabled, to be used from UI tests. */ @VisibleForTesting var isAnimationDisabled = false /** Whether or not to use automatic peek height */ private var peekHeightAuto = false /** Minimum peek height allowed */ private var peekHeightMin = 0 /** The last peek height calculated in onLayoutChild */ private var lastPeekHeight = 0 private var parentHeight = 0 /** Bottom sheet's top offset in [STATE_EXPANDED] state. */ private var fitToContentsOffset = 0 /** Bottom sheet's top offset in [STATE_HALF_EXPANDED] state. */ private var halfExpandedOffset = 0 /** Bottom sheet's top offset in [STATE_COLLAPSED] state. */ private var collapsedOffset = 0 /** Keeps reference to the bottom sheet outside of Behavior callbacks */ private var viewRef: WeakReference? = null /** Controls movement of the bottom sheet */ private lateinit var dragHelper: ViewDragHelper // Touch event handling, etc private var lastTouchX = 0 private var lastTouchY = 0 private var initialTouchY = 0 private var activePointerId = MotionEvent.INVALID_POINTER_ID private var acceptTouches = true private var minimumVelocity = 0 private var maximumVelocity = 0 private var velocityTracker: VelocityTracker? = null private var nestedScrolled = false private var nestedScrollingChildRef: WeakReference? = null private val callbacks: MutableSet = mutableSetOf() constructor() : super() @SuppressLint("PrivateResource") constructor(context: Context, attrs: AttributeSet?) : super(context, attrs) { // Re-use BottomSheetBehavior's attrs val a = context.obtainStyledAttributes(attrs, R.styleable.BottomSheetBehavior_Layout) val value = a.peekValue(R.styleable.BottomSheetBehavior_Layout_behavior_peekHeight) peekHeight = if (value != null && value.data == PEEK_HEIGHT_AUTO) { value.data } else { a.getDimensionPixelSize( R.styleable.BottomSheetBehavior_Layout_behavior_peekHeight, PEEK_HEIGHT_AUTO ) } isHideable = a.getBoolean(R.styleable.BottomSheetBehavior_Layout_behavior_hideable, false) isFitToContents = a.getBoolean(R.styleable.BottomSheetBehavior_Layout_behavior_fitToContents, true) skipCollapsed = a.getBoolean(R.styleable.BottomSheetBehavior_Layout_behavior_skipCollapsed, false) a.recycle() val configuration = ViewConfiguration.get(context) minimumVelocity = configuration.scaledMinimumFlingVelocity maximumVelocity = configuration.scaledMaximumFlingVelocity } override fun onSaveInstanceState(parent: CoordinatorLayout, child: V): Parcelable { return SavedState( super.onSaveInstanceState(parent, child) ?: Bundle.EMPTY, state, peekHeight, isFitToContents, isHideable, skipCollapsed, isDraggable ) } override fun onRestoreInstanceState(parent: CoordinatorLayout, child: V, state: Parcelable) { val ss = state as SavedState super.onRestoreInstanceState(parent, child, ss.superState ?: Bundle.EMPTY) isDraggable = ss.isDraggable peekHeight = ss.peekHeight isFitToContents = ss.isFitToContents isHideable = ss.isHideable skipCollapsed = ss.skipCollapsed // Set state last. Intermediate states are restored as collapsed state. _state = if (ss.state == STATE_DRAGGING || ss.state == STATE_SETTLING) { STATE_COLLAPSED } else { ss.state } } fun addBottomSheetCallback(callback: BottomSheetCallback) { callbacks.add(callback) } fun removeBottomSheetCallback(callback: BottomSheetCallback) { callbacks.remove(callback) } private fun setStateInternal(@State state: Int) { if (_state != state) { _state = state viewRef?.get()?.let { view -> callbacks.forEach { callback -> callback.onStateChanged(view, state) } } } } // -- Layout override fun onLayoutChild( parent: CoordinatorLayout, child: V, layoutDirection: Int ): Boolean { if (parent.fitsSystemWindows && !child.fitsSystemWindows) { child.fitsSystemWindows = true } val savedTop = child.top // First let the parent lay it out parent.onLayoutChild(child, layoutDirection) parentHeight = parent.height // Calculate peek and offsets if (peekHeightAuto) { if (peekHeightMin == 0) { // init peekHeightMin @SuppressLint("PrivateResource") peekHeightMin = parent.resources.getDimensionPixelSize( R.dimen.design_bottom_sheet_peek_height_min ) } lastPeekHeight = Math.max(peekHeightMin, parentHeight - parent.width * 9 / 16) } else { lastPeekHeight = _peekHeight } fitToContentsOffset = Math.max(0, parentHeight - child.height) halfExpandedOffset = parentHeight / 2 collapsedOffset = calculateCollapsedOffset() // Offset the bottom sheet when (state) { STATE_EXPANDED -> ViewCompat.offsetTopAndBottom(child, getExpandedOffset()) STATE_HALF_EXPANDED -> ViewCompat.offsetTopAndBottom(child, halfExpandedOffset) STATE_HIDDEN -> ViewCompat.offsetTopAndBottom(child, parentHeight) STATE_COLLAPSED -> ViewCompat.offsetTopAndBottom(child, collapsedOffset) STATE_DRAGGING, STATE_SETTLING -> ViewCompat.offsetTopAndBottom( child, savedTop - child.top ) } // Init these for later viewRef = WeakReference(child) if (!::dragHelper.isInitialized) { dragHelper = ViewDragHelper.create(parent, dragCallback) } return true } private fun calculateCollapsedOffset(): Int { return if (isFitToContents) { Math.max(parentHeight - lastPeekHeight, fitToContentsOffset) } else { parentHeight - lastPeekHeight } } private fun getExpandedOffset() = if (isFitToContents) fitToContentsOffset else 0 // -- Touch events and scrolling override fun onInterceptTouchEvent( parent: CoordinatorLayout, child: V, event: MotionEvent ): Boolean { if (!isDraggable || !child.isShown) { acceptTouches = false return false } val action = event.actionMasked lastTouchX = event.x.toInt() lastTouchY = event.y.toInt() // Record velocity if (action == MotionEvent.ACTION_DOWN) { resetVelocityTracker() } if (velocityTracker == null) { velocityTracker = VelocityTracker.obtain() } velocityTracker?.addMovement(event) when (action) { MotionEvent.ACTION_UP, MotionEvent.ACTION_CANCEL -> { activePointerId = MotionEvent.INVALID_POINTER_ID if (!acceptTouches) { acceptTouches = true return false } } MotionEvent.ACTION_DOWN -> { activePointerId = event.getPointerId(event.actionIndex) initialTouchY = event.y.toInt() clearNestedScroll() if (!parent.isPointInChildBounds(child, lastTouchX, initialTouchY)) { // Not touching the sheet acceptTouches = false } } } return acceptTouches && // CoordinatorLayout can call us before the view is laid out. >_< ::dragHelper.isInitialized && dragHelper.shouldInterceptTouchEvent(event) } override fun onTouchEvent( parent: CoordinatorLayout, child: V, event: MotionEvent ): Boolean { if (!isDraggable || !child.isShown) { return false } val action = event.actionMasked if (action == MotionEvent.ACTION_DOWN && state == STATE_DRAGGING) { return true } lastTouchX = event.x.toInt() lastTouchY = event.y.toInt() // Record velocity if (action == MotionEvent.ACTION_DOWN) { resetVelocityTracker() } if (velocityTracker == null) { velocityTracker = VelocityTracker.obtain() } velocityTracker?.addMovement(event) // CoordinatorLayout can call us before the view is laid out. >_< if (::dragHelper.isInitialized) { dragHelper.processTouchEvent(event) } if (acceptTouches && action == MotionEvent.ACTION_MOVE && exceedsTouchSlop(initialTouchY, lastTouchY) ) { // Manually capture the sheet since nothing beneath us is scrolling. dragHelper.captureChildView(child, event.getPointerId(event.actionIndex)) } return acceptTouches } private fun resetVelocityTracker() { activePointerId = MotionEvent.INVALID_POINTER_ID velocityTracker?.recycle() velocityTracker = null } private fun exceedsTouchSlop(p1: Int, p2: Int) = Math.abs(p1 - p2) >= dragHelper.touchSlop // Nested scrolling override fun onStartNestedScroll( coordinatorLayout: CoordinatorLayout, child: V, directTargetChild: View, target: View, axes: Int, type: Int ): Boolean { nestedScrolled = false if (isDraggable && viewRef?.get() == directTargetChild && (axes and ViewCompat.SCROLL_AXIS_VERTICAL) != 0 ) { // Scrolling view is a descendent of the sheet and scrolling vertically. // Let's follow along! nestedScrollingChildRef = WeakReference(target) return true } return false } override fun onNestedPreScroll( coordinatorLayout: CoordinatorLayout, child: V, target: View, dx: Int, dy: Int, consumed: IntArray, type: Int ) { if (type == ViewCompat.TYPE_NON_TOUCH) { return // Ignore fling here } if (target != nestedScrollingChildRef?.get()) { return } val currentTop = child.top val newTop = currentTop - dy if (dy > 0) { // Upward if (newTop < getExpandedOffset()) { consumed[1] = currentTop - getExpandedOffset() ViewCompat.offsetTopAndBottom(child, -consumed[1]) setStateInternal(STATE_EXPANDED) } else { consumed[1] = dy ViewCompat.offsetTopAndBottom(child, -dy) setStateInternal(STATE_DRAGGING) } } else if (dy < 0) { // Downward if (!target.canScrollVertically(-1)) { if (newTop <= collapsedOffset || isHideable) { consumed[1] = dy ViewCompat.offsetTopAndBottom(child, -dy) setStateInternal(STATE_DRAGGING) } else { consumed[1] = currentTop - collapsedOffset ViewCompat.offsetTopAndBottom(child, -consumed[1]) setStateInternal(STATE_COLLAPSED) } } } dispatchOnSlide(child.top) nestedScrolled = true } override fun onStopNestedScroll( coordinatorLayout: CoordinatorLayout, child: V, target: View, type: Int ) { if (child.top == getExpandedOffset()) { setStateInternal(STATE_EXPANDED) return } if (target != nestedScrollingChildRef?.get() || !nestedScrolled) { return } settleBottomSheet(child, getYVelocity(), true) clearNestedScroll() } override fun onNestedPreFling( coordinatorLayout: CoordinatorLayout, child: V, target: View, velocityX: Float, velocityY: Float ): Boolean { return isDraggable && target == nestedScrollingChildRef?.get() && ( state != STATE_EXPANDED || super.onNestedPreFling( coordinatorLayout, child, target, velocityX, velocityY ) ) } private fun clearNestedScroll() { nestedScrolled = false nestedScrollingChildRef = null } // Settling private fun getYVelocity(): Float { return velocityTracker?.run { computeCurrentVelocity(1000, maximumVelocity.toFloat()) getYVelocity(activePointerId) } ?: 0f } private fun settleBottomSheet(sheet: View, yVelocity: Float, isNestedScroll: Boolean) { val top: Int @State val targetState: Int val flinging = yVelocity.absoluteValue > minimumVelocity if (flinging && yVelocity < 0) { // Moving up if (isFitToContents) { top = fitToContentsOffset targetState = STATE_EXPANDED } else { if (sheet.top > halfExpandedOffset) { top = halfExpandedOffset targetState = STATE_HALF_EXPANDED } else { top = 0 targetState = STATE_EXPANDED } } } else if (isHideable && shouldHide(sheet, yVelocity)) { top = parentHeight targetState = STATE_HIDDEN } else if (flinging && yVelocity > 0) { // Moving down top = collapsedOffset targetState = STATE_COLLAPSED } else { val currentTop = sheet.top if (isFitToContents) { if (Math.abs(currentTop - fitToContentsOffset) < Math.abs(currentTop - collapsedOffset) ) { top = fitToContentsOffset targetState = STATE_EXPANDED } else { top = collapsedOffset targetState = STATE_COLLAPSED } } else { if (currentTop < halfExpandedOffset) { if (currentTop < Math.abs(currentTop - collapsedOffset)) { top = 0 targetState = STATE_EXPANDED } else { top = halfExpandedOffset targetState = STATE_HALF_EXPANDED } } else { if (Math.abs(currentTop - halfExpandedOffset) < Math.abs(currentTop - collapsedOffset) ) { top = halfExpandedOffset targetState = STATE_HALF_EXPANDED } else { top = collapsedOffset targetState = STATE_COLLAPSED } } } } val startedSettling = if (isNestedScroll) { dragHelper.smoothSlideViewTo(sheet, sheet.left, top) } else { dragHelper.settleCapturedViewAt(sheet.left, top) } if (startedSettling) { setStateInternal(STATE_SETTLING) ViewCompat.postOnAnimation(sheet, SettleRunnable(sheet, targetState)) } else { setStateInternal(targetState) } } private fun shouldHide(child: View, yVelocity: Float): Boolean { if (skipCollapsed) { return true } if (child.top < collapsedOffset) { return false // it should not hide, but collapse. } val newTop = child.top + yVelocity * HIDE_FRICTION return Math.abs(newTop - collapsedOffset) / _peekHeight.toFloat() > HIDE_THRESHOLD } private fun startSettlingAnimation(child: View, state: Int) { var top: Int var finalState = state when { state == STATE_COLLAPSED -> top = collapsedOffset state == STATE_EXPANDED -> top = getExpandedOffset() state == STATE_HALF_EXPANDED -> { top = halfExpandedOffset // Skip to expanded state if we would scroll past the height of the contents. if (isFitToContents && top <= fitToContentsOffset) { finalState = STATE_EXPANDED top = fitToContentsOffset } } state == STATE_HIDDEN && isHideable -> top = parentHeight else -> throw IllegalArgumentException("Invalid state: " + state) } if (isAnimationDisabled) { // Prevent animations ViewCompat.offsetTopAndBottom(child, top - child.top) } if (dragHelper.smoothSlideViewTo(child, child.left, top)) { setStateInternal(STATE_SETTLING) ViewCompat.postOnAnimation(child, SettleRunnable(child, finalState)) } else { setStateInternal(finalState) } } private fun dispatchOnSlide(top: Int) { viewRef?.get()?.let { sheet -> val denom = if (top > collapsedOffset) { parentHeight - collapsedOffset } else { collapsedOffset - getExpandedOffset() } callbacks.forEach { callback -> callback.onSlide(sheet, (collapsedOffset - top).toFloat() / denom) } } } private inner class SettleRunnable( private val view: View, @State private val state: Int ) : Runnable { override fun run() { if (dragHelper.continueSettling(true)) { view.postOnAnimation(this) } else { setStateInternal(state) } } } private val dragCallback: ViewDragHelper.Callback = object : ViewDragHelper.Callback() { override fun tryCaptureView(child: View, pointerId: Int): Boolean { when { // Sanity check state == STATE_DRAGGING -> return false // recapture a settling sheet dragHelper.viewDragState == ViewDragHelper.STATE_SETTLING -> return true // let nested scroll handle this nestedScrollingChildRef?.get() != null -> return false } val dy = lastTouchY - initialTouchY if (dy == 0) { // ViewDragHelper tries to capture in onTouch for the ACTION_DOWN event, but there's // really no way to check for a scrolling child without a direction, so wait. return false } if (state == STATE_COLLAPSED) { if (isHideable) { // Any drag should capture in order to expand or hide the sheet return true } if (dy < 0) { // Expand on upward movement, even if there's scrolling content underneath return true } } // Check for scrolling content underneath the touch point that can scroll in the // appropriate direction. val scrollingChild = findScrollingChildUnder(child, lastTouchX, lastTouchY, -dy) return scrollingChild == null } private fun findScrollingChildUnder(view: View, x: Int, y: Int, direction: Int): View? { if (view.visibility == View.VISIBLE && dragHelper.isViewUnder(view, x, y)) { if (view.canScrollVertically(direction)) { return view } if (view is ViewGroup) { // TODO this doesn't account for elevation or child drawing order. for (i in (view.childCount - 1) downTo 0) { val child = view.getChildAt(i) val found = findScrollingChildUnder(child, x - child.left, y - child.top, direction) if (found != null) { return found } } } } return null } override fun getViewVerticalDragRange(child: View): Int { return if (isHideable) parentHeight else collapsedOffset } override fun clampViewPositionVertical(child: View, top: Int, dy: Int): Int { val maxOffset = if (isHideable) parentHeight else collapsedOffset return top.coerceIn(getExpandedOffset(), maxOffset) } override fun clampViewPositionHorizontal(child: View, left: Int, dx: Int) = child.left override fun onViewDragStateChanged(state: Int) { if (state == ViewDragHelper.STATE_DRAGGING) { setStateInternal(STATE_DRAGGING) } } override fun onViewPositionChanged(child: View, left: Int, top: Int, dx: Int, dy: Int) { dispatchOnSlide(top) } override fun onViewReleased(releasedChild: View, xvel: Float, yvel: Float) { settleBottomSheet(releasedChild, yvel, false) } } /** SavedState implementation */ internal class SavedState : AbsSavedState { @State internal val state: Int internal val peekHeight: Int internal val isFitToContents: Boolean internal val isHideable: Boolean internal val skipCollapsed: Boolean internal val isDraggable: Boolean constructor(source: Parcel) : this(source, null) constructor(source: Parcel, loader: ClassLoader?) : super(source, loader) { state = source.readInt() peekHeight = source.readInt() isFitToContents = source.readBooleanUsingCompat() isHideable = source.readBooleanUsingCompat() skipCollapsed = source.readBooleanUsingCompat() isDraggable = source.readBooleanUsingCompat() } constructor( superState: Parcelable, @State state: Int, peekHeight: Int, isFitToContents: Boolean, isHideable: Boolean, skipCollapsed: Boolean, isDraggable: Boolean ) : super(superState) { this.state = state this.peekHeight = peekHeight this.isFitToContents = isFitToContents this.isHideable = isHideable this.skipCollapsed = skipCollapsed this.isDraggable = isDraggable } override fun writeToParcel(dest: Parcel, flags: Int) { super.writeToParcel(dest, flags) dest.apply { writeInt(state) writeInt(peekHeight) writeBooleanUsingCompat(isFitToContents) writeBooleanUsingCompat(isHideable) writeBooleanUsingCompat(skipCollapsed) writeBooleanUsingCompat(isDraggable) } } companion object { @JvmField val CREATOR: Parcelable.Creator = object : Parcelable.ClassLoaderCreator { override fun createFromParcel(source: Parcel): SavedState { return SavedState(source, null) } override fun createFromParcel(source: Parcel, loader: ClassLoader): SavedState { return SavedState(source, loader) } override fun newArray(size: Int): Array { return arrayOfNulls(size) } } } } } ================================================ FILE: mobile/src/main/java/com/google/samples/apps/iosched/widget/BubbleDecoration.kt ================================================ /* * Copyright 2019 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.widget import android.animation.Animator import android.animation.AnimatorListenerAdapter import android.animation.ValueAnimator import android.content.Context import android.graphics.Canvas import android.graphics.Paint import android.graphics.Paint.Style.FILL import android.graphics.RectF import androidx.core.view.forEach import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView.ItemDecoration import androidx.recyclerview.widget.RecyclerView.State import com.google.samples.apps.iosched.R import com.google.samples.apps.iosched.util.lerp import kotlin.math.max import kotlin.math.min /** * ItemDecoration that draws a bubble background around items in a specified range. */ class BubbleDecoration(context: Context) : ItemDecoration() { private val paint = Paint(Paint.ANTI_ALIAS_FLAG).apply { style = FILL } private val insetHorizontal: Float private val insetVertical: Float private val currentRect = RectF() private val previousRect = RectF() private val temp = RectF() // to avoid object allocations private var animator: ValueAnimator? = null private var pendingAnimation = false private var progress = 1f /** The adapter positions to decorate. */ var bubbleRange: IntRange = -1..-1 set(value) { field = value pendingAnimation = true } init { val attrs = context.obtainStyledAttributes( R.style.Widget_IOSched_DayIndicatorDecoration, R.styleable.DayIndicatorDecoration ) paint.color = attrs.getColor(R.styleable.DayIndicatorDecoration_android_color, 0) insetHorizontal = attrs.getDimension(R.styleable.DayIndicatorDecoration_insetHorizontal, 0f) insetVertical = attrs.getDimension(R.styleable.DayIndicatorDecoration_insetVertical, 0f) attrs.recycle() } override fun onDraw(canvas: Canvas, parent: RecyclerView, state: State) { if (pendingAnimation) { pendingAnimation = false animator?.cancel() // Update rects computeTargetRect(parent, state, bubbleRange, temp) previousRect.set(currentRect) currentRect.set(temp) startAnimatorIfNeeded(previousRect, currentRect, parent) } val rect = getDrawingRect(previousRect, currentRect) drawBubble(rect, canvas) } private fun drawBubble(rect: RectF, canvas: Canvas) { if (rect.isEmpty) return val radius = min(rect.width(), rect.height()) / 2 canvas.drawRoundRect(rect, radius, radius, paint) } private fun getDrawingRect(initial: RectF, target: RectF): RectF { when { initial.isEmpty -> computeScalingRect(target, progress) target.isEmpty -> computeScalingRect(initial, progress) else -> computeMovingRect(initial, target, progress) } return temp } private fun computeScalingRect(rect: RectF, progress: Float) { // Create the effect of growing/shrinking from the center. val dx = rect.width() * progress / 2 val dy = rect.height() * progress / 2 temp.set( rect.centerX() - dx, rect.centerY() - dy, rect.centerX() + dx, rect.centerY() + dy ) } private fun computeMovingRect(initial: RectF, target: RectF, progress: Float) { temp.set( lerp(initial.left, target.left, progress), lerp(initial.top, target.top, progress), lerp(initial.right, target.right, progress), lerp(initial.bottom, target.bottom, progress) ) } private fun computeTargetRect( parent: RecyclerView, state: State, range: IntRange, outRectF: RectF ) { if (state.itemCount < 1 || range.isEmpty()) { outRectF.setEmpty() return } var minLeft = parent.width.toFloat() var minTop = parent.height.toFloat() var maxRight = 0f var maxBottom = 0f // Compose the rect using views whose adapter positions are in range. There may be extra // views due to item animations, so only use the first view found for each position. val seenPositions = hashSetOf() parent.forEach { view -> val position = parent.getChildViewHolder(view).adapterPosition if (position != -1 && position in range && seenPositions.add(position)) { minLeft = min(minLeft, view.left.toFloat()) minTop = min(minTop, view.top.toFloat()) maxRight = max(maxRight, view.right.toFloat()) maxBottom = max(maxBottom, view.bottom.toFloat()) } } outRectF.set(minLeft, minTop, maxRight, maxBottom) outRectF.inset(insetHorizontal, insetVertical) } private fun startAnimatorIfNeeded(initial: RectF, target: RectF, parent: RecyclerView) { if ((initial.isEmpty && target.isEmpty) || initial == target) { return } animator = if (target.isEmpty) { ValueAnimator.ofFloat(1f, 0f) // disappearing animation } else { ValueAnimator.ofFloat(0f, 1f) // appearing or moving animation }.apply { addListener(object : AnimatorListenerAdapter() { override fun onAnimationEnd(animation: Animator?) { animator = null } }) addUpdateListener { progress = animatedValue as Float // Invalidate so we get to draw on the next frame. parent.invalidateItemDecorations() } start() } } } ================================================ FILE: mobile/src/main/java/com/google/samples/apps/iosched/widget/CollapsibleCard.kt ================================================ /* * Copyright 2018 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.widget import android.content.Context import android.os.Parcel import android.os.Parcelable import android.text.method.LinkMovementMethod import android.transition.Transition import android.transition.TransitionInflater import android.transition.TransitionManager import android.util.AttributeSet import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.FrameLayout import android.widget.ImageView import android.widget.TextView import androidx.core.text.HtmlCompat import com.google.samples.apps.iosched.R /** * Collapsible card, description of which can be HTML. * In that case, the text specified as "cardDescription" needs to be wrapped with */ class CollapsibleCard @JvmOverloads constructor( context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0 ) : FrameLayout(context, attrs, defStyleAttr) { private var expanded = false private val cardTitleView: TextView private lateinit var cardDescriptionView: TextView private val expandIcon: ImageView private val titleContainer: View private val toggle: Transition private val root: View private val cardTitle: String? init { val arr = context.obtainStyledAttributes(attrs, R.styleable.CollapsibleCard, 0, 0) cardTitle = arr.getString(R.styleable.CollapsibleCard_cardTitle) val cardDescription = arr.getString(R.styleable.CollapsibleCard_cardDescription) arr.recycle() root = LayoutInflater.from(context) .inflate(R.layout.collapsible_card_content, this, true) titleContainer = root.findViewById(R.id.title_container) cardTitleView = root.findViewById(R.id.card_title).apply { text = cardTitle } setTitleContentDescription(cardTitle) cardDescription?.let { cardDescriptionView = root.findViewById(R.id.card_description).apply { text = HtmlCompat.fromHtml(it, HtmlCompat.FROM_HTML_MODE_COMPACT) movementMethod = LinkMovementMethod.getInstance() } } expandIcon = root.findViewById(R.id.expand_icon) toggle = TransitionInflater.from(context) .inflateTransition(R.transition.info_card_toggle) titleContainer.setOnClickListener { toggleExpanded() } } private fun setTitleContentDescription(cardTitle: String?) { val res = resources cardTitleView.contentDescription = "$cardTitle, " + if (expanded) { res.getString(R.string.expanded) } else { res.getString(R.string.collapsed) } } private fun toggleExpanded() { expanded = !expanded toggle.duration = if (expanded) 300L else 200L TransitionManager.beginDelayedTransition(root.parent as ViewGroup, toggle) cardDescriptionView.visibility = if (expanded) View.VISIBLE else View.GONE expandIcon.rotationX = if (expanded) 180f else 0f setTitleContentDescription(cardTitle) } override fun onSaveInstanceState(): Parcelable { val savedState = SavedState(super.onSaveInstanceState()!!) savedState.expanded = expanded return savedState } override fun onRestoreInstanceState(state: Parcelable?) { if (state is SavedState) { super.onRestoreInstanceState(state.superState) if (expanded != state.expanded) { toggleExpanded() } } else { super.onRestoreInstanceState(state) } } internal class SavedState : BaseSavedState { var expanded = false constructor(source: Parcel) : super(source) { expanded = source.readByte().toInt() != 0 } constructor(superState: Parcelable) : super(superState) override fun writeToParcel(out: Parcel, flags: Int) { super.writeToParcel(out, flags) out.writeByte((if (expanded) 1 else 0).toByte()) } companion object { @JvmField val CREATOR = object : Parcelable.Creator { override fun createFromParcel(source: Parcel): SavedState { return SavedState(source) } override fun newArray(size: Int): Array { return arrayOfNulls(size) } } } } } ================================================ FILE: mobile/src/main/java/com/google/samples/apps/iosched/widget/CountdownView.kt ================================================ /* * Copyright 2018 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.widget import android.content.Context import android.util.AttributeSet import android.view.LayoutInflater import android.view.View import android.view.accessibility.AccessibilityEvent import androidx.constraintlayout.widget.ConstraintLayout import androidx.core.view.AccessibilityDelegateCompat import androidx.core.view.ViewCompat import androidx.core.view.postDelayed import com.airbnb.lottie.LottieAnimationView import com.airbnb.lottie.LottieComposition import com.airbnb.lottie.LottieCompositionFactory import com.google.samples.apps.iosched.R import com.google.samples.apps.iosched.shared.util.TimeUtils import kotlin.properties.ObservableProperty import kotlin.reflect.KProperty import org.threeten.bp.Duration import org.threeten.bp.ZonedDateTime import timber.log.Timber class CountdownView @JvmOverloads constructor( context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0 ) : ConstraintLayout(context, attrs, defStyleAttr) { private val compositions = CompositionSet() private val root: View = LayoutInflater.from(context).inflate(R.layout.countdown, this, true) private var days1 by AnimateDigitDelegate(compositions) { root.findViewById(R.id.countdown_days_1) } private var days2 by AnimateDigitDelegate(compositions) { root.findViewById(R.id.countdown_days_2) } private var hours1 by AnimateDigitDelegate(compositions) { root.findViewById(R.id.countdown_hours_1) } private var hours2 by AnimateDigitDelegate(compositions) { root.findViewById(R.id.countdown_hours_2) } private var mins1 by AnimateDigitDelegate(compositions) { root.findViewById(R.id.countdown_mins_1) } private var mins2 by AnimateDigitDelegate(compositions) { root.findViewById(R.id.countdown_mins_2) } private var secs1 by AnimateDigitDelegate(compositions) { root.findViewById(R.id.countdown_secs_1) } private var secs2 by AnimateDigitDelegate(compositions) { root.findViewById(R.id.countdown_secs_2) } private val conferenceStart = TimeUtils.ConferenceDays.first().start.plusHours(3L) data class Countdown( val days: Int, val hours: Int, val minutes: Int, val seconds: Int ) { companion object { fun until(time: ZonedDateTime): Countdown? { var duration = Duration.between(ZonedDateTime.now(), time) if (duration.isNegative) { return null } val days = duration.toDays() duration = duration.minusDays(days) val hours = duration.toHours() duration = duration.minusHours(hours) val mins = duration.toMinutes() duration = duration.minusMinutes(mins) val secs = duration.seconds return Countdown(days.toInt(), hours.toInt(), mins.toInt(), secs.toInt()) } } } init { isFocusableInTouchMode = true ViewCompat.setAccessibilityDelegate( this, object : AccessibilityDelegateCompat() { override fun dispatchPopulateAccessibilityEvent( host: View?, event: AccessibilityEvent? ): Boolean { return if (event != null) { val countdown = Countdown.until(conferenceStart) if (countdown != null) { val res = context.resources event.text.add( res.getQuantityString( R.plurals.duration_days, countdown.days, countdown.days ) ) event.text.add( res.getQuantityString( R.plurals.duration_hours, countdown.hours, countdown.hours ) ) event.text.add( res.getQuantityString( R.plurals.duration_minutes, countdown.minutes, countdown.minutes ) ) event.text.add( res.getQuantityString( R.plurals.duration_seconds, countdown.seconds, countdown.seconds ) ) } true } else { super.dispatchPopulateAccessibilityEvent(host, event) } } } ) } private val updateTime: Runnable = object : Runnable { override fun run() { val countdown = Countdown.until(conferenceStart) ?: return compositions.doOnReady { days1 = (countdown.days / 10) days2 = (countdown.days % 10) hours1 = (countdown.hours / 10) hours2 = (countdown.hours % 10) mins1 = (countdown.minutes / 10) mins2 = (countdown.minutes % 10) secs1 = (countdown.seconds / 10) secs2 = (countdown.seconds % 10) handler?.postDelayed(this, 1_000L) // Run self every second } } } override fun onAttachedToWindow() { super.onAttachedToWindow() Timber.d("Starting countdown") handler?.post(updateTime) compositions.load(context) } override fun onDetachedFromWindow() { super.onDetachedFromWindow() Timber.d("Stopping countdown") handler?.removeCallbacks(updateTime) compositions.clear() } /** * A delegate who upon receiving a new value, runs animations on a view obtained from * [viewProvider] */ private class AnimateDigitDelegate( private val compositions: CompositionSet, private val viewProvider: () -> LottieAnimationView ) : ObservableProperty(-1) { override fun afterChange(property: KProperty<*>, oldValue: Int, newValue: Int) { // Sanity check, `newValue` should always be in range [0–9] if (newValue < 0 || newValue > 9) { Timber.e("Trying to animate to digit: $newValue") return } if (oldValue != newValue) { val view = viewProvider() if (oldValue != -1) { // Animate out the prev digit i.e play the second half of it's comp compositions[oldValue]?.let { view.setComposition(it) } view.setMinAndMaxProgress(0.5f, 1f) // Some issues scheduling & playing 2 * 500ms comps every 1s. Speed up the // outward anim slightly to give us some headroom ¯\_(ツ)_/¯ view.speed = 1.1f view.playAnimation() view.postDelayed(500L) { compositions[newValue]?.let { view.setComposition(it) } view.setMinAndMaxProgress(0f, 0.5f) view.speed = 1f view.playAnimation() } } else { // Initial show, just animate in the desired digit compositions[newValue]?.let { view.setComposition(it) } view.setMinAndMaxProgress(0f, 0.5f) view.playAnimation() } } } } } private class CompositionSet { private val _compositions = arrayOfNulls(10) private var doOnReadyCallback: (() -> Unit)? = null val ready: Boolean get() = _compositions.all { it != null } fun load(context: Context) { for (i in 0..9) { LottieCompositionFactory.fromAsset(context, "anim/$i.json").addListener { composition -> _compositions[i] = composition if (ready) { doOnReadyCallback?.let { it() doOnReadyCallback = null } } } } } fun doOnReady(body: () -> Unit) { if (ready) { body() } else { doOnReadyCallback = body } } fun clear() { for (i in 0..9) { _compositions[i] = null } } operator fun get(i: Int): LottieComposition? { return _compositions[i] } } ================================================ FILE: mobile/src/main/java/com/google/samples/apps/iosched/widget/CustomSwipeRefreshLayout.kt ================================================ /* * Copyright 2018 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.widget import android.content.Context import android.util.AttributeSet import android.view.MotionEvent import androidx.swiperefreshlayout.widget.SwipeRefreshLayout class CustomSwipeRefreshLayout : SwipeRefreshLayout { private var startGestureX: Float = 0f private var startGestureY: Float = 0f constructor(context: Context) : super(context) constructor(context: Context, attrs: AttributeSet?) : super(context, attrs) override fun onInterceptTouchEvent(event: MotionEvent): Boolean { when (event.action) { MotionEvent.ACTION_DOWN -> { startGestureX = event.x startGestureY = event.y } MotionEvent.ACTION_MOVE -> { if (Math.abs(event.x - startGestureX) > Math.abs(event.y - startGestureY)) { return false } } } return super.onInterceptTouchEvent(event) } } ================================================ FILE: mobile/src/main/java/com/google/samples/apps/iosched/widget/EventCardView.kt ================================================ /* * Copyright 2018 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.widget import android.content.Context import android.util.AttributeSet import android.view.LayoutInflater import android.widget.ImageView import android.widget.TextView import com.google.android.material.card.MaterialCardView import com.google.samples.apps.iosched.R class EventCardView @JvmOverloads constructor( context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0 ) : MaterialCardView(context, attrs, defStyleAttr) { init { val arr = context.obtainStyledAttributes( attrs, R.styleable.EventCardView, defStyleAttr, R.style.Widget_IOSched_EventCardView ) val eventTitle = arr.getString(R.styleable.EventCardView_eventTitle) val eventDescription = arr.getString(R.styleable.EventCardView_eventDescription) val eventTypeLogo = arr.getDrawable(R.styleable.EventCardView_eventTypeLogo) val eventTypeLogoBg = arr.getDrawable(R.styleable.EventCardView_eventTypeLogoBackground) arr.recycle() LayoutInflater.from(context).inflate(R.layout.event_card_content, this, true) findViewById(R.id.header_image).apply { background = eventTypeLogoBg setImageDrawable(eventTypeLogo) } findViewById(R.id.event_title).apply { text = eventTitle } findViewById(R.id.event_description).apply { text = eventDescription } } } ================================================ FILE: mobile/src/main/java/com/google/samples/apps/iosched/widget/FadingSnackbar.kt ================================================ /* * Copyright 2018 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.widget import android.content.Context import android.util.AttributeSet import android.view.LayoutInflater import android.widget.Button import android.widget.FrameLayout import android.widget.TextView import androidx.annotation.StringRes import androidx.core.view.postDelayed import com.google.samples.apps.iosched.R /** * A custom snackbar implementation allowing more control over placement and entry/exit animations. */ class FadingSnackbar(context: Context, attrs: AttributeSet) : FrameLayout(context, attrs) { private val message: TextView private val action: Button init { val view = LayoutInflater.from(context).inflate(R.layout.fading_snackbar_layout, this, true) message = view.findViewById(R.id.snackbar_text) action = view.findViewById(R.id.snackbar_action) } fun dismiss() { if (visibility == VISIBLE && alpha == 1f) { animate() .alpha(0f) .withEndAction { visibility = GONE } .duration = EXIT_DURATION } } fun show( @StringRes messageId: Int = 0, messageText: CharSequence? = null, @StringRes actionId: Int? = null, longDuration: Boolean = true, actionClick: () -> Unit = { dismiss() }, dismissListener: () -> Unit = { } ) { message.text = messageText ?: context.getString(messageId) if (actionId != null) { action.run { visibility = VISIBLE text = context.getString(actionId) setOnClickListener { actionClick() } } } else { action.visibility = GONE } alpha = 0f visibility = VISIBLE animate() .alpha(1f) .duration = ENTER_DURATION val showDuration = ENTER_DURATION + if (longDuration) LONG_DURATION else SHORT_DURATION postDelayed(showDuration) { dismiss() dismissListener() } } companion object { private const val ENTER_DURATION = 300L private const val EXIT_DURATION = 200L private const val SHORT_DURATION = 1_500L private const val LONG_DURATION = 2_750L } } ================================================ FILE: mobile/src/main/java/com/google/samples/apps/iosched/widget/HashtagIoDecoration.kt ================================================ /* * Copyright 2019 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.widget import android.content.Context import android.graphics.Canvas import android.graphics.Rect import android.graphics.drawable.Drawable import android.view.View import androidx.core.graphics.withTranslation import androidx.core.view.forEach import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView.ItemDecoration import androidx.recyclerview.widget.RecyclerView.State import com.google.samples.apps.iosched.R import com.google.samples.apps.iosched.util.isRtl import kotlin.math.max import kotlin.math.roundToInt class HashtagIoDecoration(context: Context) : ItemDecoration() { private val drawable: Drawable? private val margin: Int private var decorBottom = 0 init { val attrs = context.obtainStyledAttributes( R.style.Widget_IOSched_HashtagIoDecoration, R.styleable.HashtagIoDecoration ) drawable = attrs.getDrawable(R.styleable.HashtagIoDecoration_android_drawable)?.apply { setBounds(0, 0, intrinsicWidth, intrinsicHeight) } margin = attrs.getDimensionPixelSize(R.styleable.HashtagIoDecoration_margin, 0) attrs.recycle() decorBottom = 2 * margin + (drawable?.intrinsicHeight ?: 0) } override fun getItemOffsets(outRect: Rect, view: View, parent: RecyclerView, state: State) { // Decorate the last child only. if (drawable == null || parent.getChildAdapterPosition(view) != state.itemCount - 1) { super.getItemOffsets(outRect, view, parent, state) } else { outRect.set(0, 0, 0, decorBottom) } } override fun onDraw(canvas: Canvas, parent: RecyclerView, state: State) { if (drawable == null) { return } val x = if (parent.isRtl()) { parent.paddingEnd + margin } else { parent.width - parent.paddingEnd - margin - drawable.intrinsicWidth } val yFromParentBottom = parent.height - parent.paddingBottom - margin - drawable.intrinsicHeight if (state.itemCount < 1) { // No children. Just draw at the bottom of the parent. drawDecoration(canvas, x, yFromParentBottom) return } // Find the decorated view or bust. val child = findTargetChild(parent, state.itemCount - 1) ?: return val yFromChildBottom = child.bottom + child.translationY.roundToInt() + margin if (yFromChildBottom > parent.height) { // There's no room below the child, so the decoration is not visible. return } // Pin the decoration to the bottom of the parent if there's excess space. val y = max(yFromChildBottom, yFromParentBottom) drawDecoration(canvas, x, y) } private fun findTargetChild(parent: RecyclerView, adapterPosition: Int): View? { parent.forEach { child -> if (parent.getChildAdapterPosition(child) == adapterPosition) { return child } } return null } private fun drawDecoration(canvas: Canvas, x: Int, y: Int) { canvas.withTranslation(x = x.toFloat(), y = y.toFloat()) { drawable?.draw(canvas) } } } ================================================ FILE: mobile/src/main/java/com/google/samples/apps/iosched/widget/IoSlidingPaneLayout.kt ================================================ /* * Copyright 2021 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.widget import android.content.Context import android.util.AttributeSet import androidx.slidingpanelayout.widget.SlidingPaneLayout // TODO(b/187348546) Remove when SlidingPaneLayout can support all MeasureSpec modes. class IoSlidingPaneLayout @JvmOverloads constructor( context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0 ) : SlidingPaneLayout(context, attrs, defStyleAttr) { override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) { val widthSpec = if (MeasureSpec.getMode(widthMeasureSpec) != MeasureSpec.EXACTLY) { // SlidingPaneLayout throws an exception when widthMode is not EXACTLY, so change to // EXACTLY and continue measuring. val widthSize = MeasureSpec.getSize(widthMeasureSpec) MeasureSpec.makeMeasureSpec( if (widthSize > 0) widthSize else 500, MeasureSpec.EXACTLY ) } else { widthMeasureSpec } val heightSpec = if (MeasureSpec.getMode(widthMeasureSpec) == MeasureSpec.UNSPECIFIED) { // SlidingPaneLayout throws an exception when heightMode is UNSPECIFIED, so change // to AT_MOST and continue measuring. val heightSize = MeasureSpec.getSize(widthMeasureSpec) MeasureSpec.makeMeasureSpec( if (heightSize > 0) heightSize else 500, MeasureSpec.AT_MOST ) } else { heightMeasureSpec } super.onMeasure(widthSpec, heightSpec) } } ================================================ FILE: mobile/src/main/java/com/google/samples/apps/iosched/widget/JumpSmoothScroller.kt ================================================ /* * Copyright 2019 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.widget import android.content.Context import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearSmoothScroller import androidx.recyclerview.widget.RecyclerView.State /** * [LinearSmoothScroller] implementation that first jumps closer to the target position if necessary * in order to avoid really long scrolling animations. */ class JumpSmoothScroller( context: Context, /** Maximum position difference to scroll normally without jumping first. */ private val maxDifference: Int = 5 ) : LinearSmoothScroller(context) { override fun getVerticalSnapPreference() = SNAP_TO_START override fun getHorizontalSnapPreference() = SNAP_TO_START override fun onSeekTargetStep(dx: Int, dy: Int, state: State, action: Action) { val layoutManager = layoutManager as? LinearLayoutManager if (layoutManager != null) { // If we're far enough away from the target position, jump closer before scrolling if (targetPosition + maxDifference < layoutManager.findFirstVisibleItemPosition()) { action.jumpTo(targetPosition + maxDifference) return } if (targetPosition - maxDifference > layoutManager.findLastVisibleItemPosition()) { action.jumpTo(targetPosition - maxDifference) return } } // Otherwise let superclass handle scrolling normally. super.onSeekTargetStep(dx, dy, state, action) } } ================================================ FILE: mobile/src/main/java/com/google/samples/apps/iosched/widget/NavigationBarContentFrameLayout.kt ================================================ /* * Copyright 2019 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.widget import android.content.Context import android.graphics.Canvas import android.graphics.Color import android.graphics.drawable.ColorDrawable import android.util.AttributeSet import android.view.Window import android.view.WindowInsets import android.widget.FrameLayout import com.google.samples.apps.iosched.R import kotlin.LazyThreadSafetyMode.NONE /** * A [FrameLayout] which will draw a divider on the edge of the navigation bar. Similar in * functionality to what [Window.setNavigationBarDividerColor] provides, but works with translucent * navigation bar colors. */ class NavigationBarContentFrameLayout @JvmOverloads constructor( context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0 ) : FrameLayout(context, attrs, defStyleAttr) { var navigationBarDividerColor: Int = 0 set(value) { field = value dividerDrawable.color = value } var navigationBarDividerSize: Int = 0 set(value) { field = value updateDividerBounds() } private var lastInsets: WindowInsets? = null private val dividerDrawable by lazy(NONE) { ColorDrawable(navigationBarDividerColor).apply { callback = this@NavigationBarContentFrameLayout alpha = 255 } } init { val a = context.obtainStyledAttributes( attrs, R.styleable.NavigationBarContentFrameLayout, defStyleAttr, R.style.Widget_IOSched_NavigationBarContentFrameLayout ) navigationBarDividerColor = a.getColor( R.styleable.NavigationBarContentFrameLayout_navigationBarBorderColor, Color.MAGENTA ) navigationBarDividerSize = a.getDimensionPixelSize( R.styleable.NavigationBarContentFrameLayout_navigationBarBorderSize, 0 ) a.recycle() } override fun onSizeChanged(w: Int, h: Int, oldw: Int, oldh: Int) { super.onSizeChanged(w, h, oldw, oldh) updateDividerBounds() } override fun draw(canvas: Canvas) { super.draw(canvas) val d = dividerDrawable if (!d.bounds.isEmpty) { d.draw(canvas) } } override fun onApplyWindowInsets(insets: WindowInsets): WindowInsets { lastInsets = insets updateDividerBounds() return insets } private fun updateDividerBounds() { val d = dividerDrawable val insets = lastInsets val bottomInset = insets?.systemWindowInsetBottom ?: 0 val leftInset = insets?.systemWindowInsetLeft ?: 0 val rightInset = insets?.systemWindowInsetRight ?: 0 when { bottomInset > 0 -> { // Display divider above bottom inset d.setBounds( left, bottom - bottomInset, right, bottom + navigationBarDividerSize - bottomInset ) } leftInset > 0 -> { // Display divider to the right of the left inset d.setBounds( leftInset - navigationBarDividerSize, top, leftInset, bottom ) } rightInset > 0 -> { // Display divider to the left of the right inset d.setBounds( right - rightInset, top, right + navigationBarDividerSize - rightInset, bottom ) } else -> { // Set an empty size which will remove the drawable d.setBounds(0, 0, 0, 0) } } // Update our will-not-draw flag setWillNotDraw(d.bounds.isEmpty) } } ================================================ FILE: mobile/src/main/java/com/google/samples/apps/iosched/widget/NoTouchRecyclerView.kt ================================================ /* * Copyright 2019 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.widget import android.content.Context import android.util.AttributeSet import android.view.MotionEvent import androidx.recyclerview.widget.RecyclerView /** * RecyclerView that rejects all touch events. This is useful for preventing a nested RecyclerView * from absorbing clicks or initiating unwanted scrolls. */ class NoTouchRecyclerView @JvmOverloads constructor( context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0 ) : RecyclerView(context, attrs, defStyleAttr) { override fun dispatchTouchEvent(ev: MotionEvent?): Boolean = false } ================================================ FILE: mobile/src/main/java/com/google/samples/apps/iosched/widget/SimpleRatingBar.kt ================================================ /* * Copyright 2019 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.widget import android.content.Context import android.util.AttributeSet import android.widget.SeekBar import androidx.appcompat.widget.AppCompatSeekBar import androidx.core.content.res.ResourcesCompat import com.google.samples.apps.iosched.R /** * This is like [android.widget.RatingBar], but looks like SeekBar. */ class SimpleRatingBar @JvmOverloads constructor( context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0 ) : AppCompatSeekBar(context, attrs, defStyleAttr) { private val rated = thumb private val unrated = ResourcesCompat.getDrawable( resources, R.drawable.unrated_thumb, context.theme ) private var isRated: Boolean = false private var onRateListener: OnRateListener? = null init { super.setOnSeekBarChangeListener(object : OnSeekBarChangeListener { override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) { if (fromUser) { onRateListener?.onRate(progress + 1) } } override fun onStopTrackingTouch(seekBar: SeekBar?) { // Do nothing } override fun onStartTrackingTouch(seekBar: SeekBar?) { thumb = rated } }) } override fun setProgress(progress: Int) { super.setProgress(progress) updateIndicator(progress) } override fun setProgress(progress: Int, animate: Boolean) { super.setProgress(progress, animate) updateIndicator(progress) } override fun setOnSeekBarChangeListener(l: OnSeekBarChangeListener?) { throw UnsupportedOperationException("Use setOnRateListener") } fun setOnRateListener(listener: OnRateListener) { onRateListener = listener } private fun updateIndicator(progress: Int) { thumb = if (progress == -1) { isRated = false unrated } else { isRated = true rated } } interface OnRateListener { fun onRate(rate: Int) } } ================================================ FILE: mobile/src/main/java/com/google/samples/apps/iosched/widget/SpaceDecoration.kt ================================================ /* * Copyright 2018 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.widget import android.graphics.Rect import android.view.View import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView.ItemDecoration import androidx.recyclerview.widget.RecyclerView.State import com.google.samples.apps.iosched.util.isRtl /** ItemDecoration that adds space around items. */ class SpaceDecoration( private val start: Int = 0, private val top: Int = 0, private val end: Int = 0, private val bottom: Int = 0 ) : ItemDecoration() { override fun getItemOffsets(outRect: Rect, view: View, parent: RecyclerView, state: State) { val isRtl = parent.isRtl() outRect.set( if (isRtl) end else start, top, if (isRtl) start else end, bottom ) } } ================================================ FILE: mobile/src/main/java/com/google/samples/apps/iosched/widget/transition/RotateX.kt ================================================ /* * Copyright 2018 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.samples.apps.iosched.widget.transition import android.animation.Animator import android.animation.ObjectAnimator import android.content.Context import android.transition.Transition import android.transition.TransitionValues import android.util.AttributeSet import android.view.View import android.view.ViewGroup import androidx.annotation.Keep /** * A [Transition] which animates the rotation of a [View]. */ class RotateX : Transition { @Keep constructor() : super() @Keep constructor(context: Context, attrs: AttributeSet) : super(context, attrs) override fun getTransitionProperties(): Array { return TRANSITION_PROPERTIES } override fun captureStartValues(transitionValues: TransitionValues) { captureValues(transitionValues) } override fun captureEndValues(transitionValues: TransitionValues) { captureValues(transitionValues) } override fun createAnimator( sceneRoot: ViewGroup, startValues: TransitionValues?, endValues: TransitionValues? ): Animator? { if (startValues == null || endValues == null) return null val startRotation = startValues.values[PROP_ROTATION] as Float val endRotation = endValues.values[PROP_ROTATION] as Float if (startRotation == endRotation) return null val view = endValues.view // ensure the pivot is set view.pivotX = view.width / 2f view.pivotY = view.height / 2f return ObjectAnimator.ofFloat(view, View.ROTATION_X, startRotation, endRotation) } private fun captureValues(transitionValues: TransitionValues) { val view = transitionValues.view if (view == null || view.width <= 0 || view.height <= 0) return transitionValues.values[PROP_ROTATION] = view.rotationX } companion object { private const val PROP_ROTATION = "iosched:rotate:rotation" private val TRANSITION_PROPERTIES = arrayOf(PROP_ROTATION) } } ================================================ FILE: mobile/src/main/res/animator/active_alpha.xml ================================================ ================================================ FILE: mobile/src/main/res/color/chip_bg.xml ================================================ ================================================ FILE: mobile/src/main/res/color/chip_stroke.xml ================================================ ================================================ FILE: mobile/src/main/res/color/map_variant_icon.xml ================================================ ================================================ FILE: mobile/src/main/res/color/map_variant_text.xml ================================================ ================================================ FILE: mobile/src/main/res/color/navigation_item_background_tint.xml ================================================ ================================================ FILE: mobile/src/main/res/color/schedule_day_indicator_text.xml ================================================ ================================================ FILE: mobile/src/main/res/drawable/arcore_gray.xml ================================================ ================================================ FILE: mobile/src/main/res/drawable/asld_chip_icon.xml ================================================ ================================================ FILE: mobile/src/main/res/drawable/asld_reservation.xml ================================================ ================================================ FILE: mobile/src/main/res/drawable/asld_star_event.xml ================================================ ================================================ FILE: mobile/src/main/res/drawable/avd_chip_check_to_dot.xml ================================================ ================================================ FILE: mobile/src/main/res/drawable/avd_chip_dot_to_check.xml ================================================ ================================================ FILE: mobile/src/main/res/drawable/avd_pending_to_reservable.xml ================================================ ================================================ FILE: mobile/src/main/res/drawable/avd_pending_to_reserved.xml ================================================ ================================================ FILE: mobile/src/main/res/drawable/avd_pending_to_waitlisted.xml ================================================ ================================================ FILE: mobile/src/main/res/drawable/avd_reservable_to_pending.xml ================================================ ================================================ FILE: mobile/src/main/res/drawable/avd_reserved_to_pending.xml ================================================ ================================================ FILE: mobile/src/main/res/drawable/avd_star_event.xml ================================================ ================================================ FILE: mobile/src/main/res/drawable/avd_unstar_event.xml ================================================ ================================================ FILE: mobile/src/main/res/drawable/avd_waitlisted_to_pending.xml ================================================ ================================================ FILE: mobile/src/main/res/drawable/bullet_small.xml ================================================ ================================================ FILE: mobile/src/main/res/drawable/chip_check.xml ================================================ ================================================ FILE: mobile/src/main/res/drawable/chip_dot.xml ================================================ ================================================ FILE: mobile/src/main/res/drawable/divider_empty_margin_normal.xml ================================================ ================================================ FILE: mobile/src/main/res/drawable/divider_empty_margin_small.xml ================================================ ================================================ FILE: mobile/src/main/res/drawable/divider_slash.xml ================================================ ================================================ FILE: mobile/src/main/res/drawable/event_header_afterhours.xml ================================================ ================================================ FILE: mobile/src/main/res/drawable/event_header_codelabs.xml ================================================ ================================================ FILE: mobile/src/main/res/drawable/event_header_meals.xml ================================================ ================================================ FILE: mobile/src/main/res/drawable/event_header_office_hours.xml ================================================ ================================================ FILE: mobile/src/main/res/drawable/event_header_sandbox.xml ================================================ ================================================ FILE: mobile/src/main/res/drawable/event_header_sessions.xml ================================================ ================================================ FILE: mobile/src/main/res/drawable/event_narrow_afterhours.xml ================================================ ================================================ FILE: mobile/src/main/res/drawable/event_narrow_app_reviews1.xml ================================================ ================================================ FILE: mobile/src/main/res/drawable/event_narrow_app_reviews2.xml ================================================ ================================================ FILE: mobile/src/main/res/drawable/event_narrow_app_reviews3.xml ================================================ ================================================ FILE: mobile/src/main/res/drawable/event_narrow_game_reviews1.xml ================================================ ================================================ FILE: mobile/src/main/res/drawable/event_narrow_game_reviews2.xml ================================================ ================================================ FILE: mobile/src/main/res/drawable/event_narrow_game_reviews3.xml ================================================ ================================================ FILE: mobile/src/main/res/drawable/event_narrow_keynote.xml ================================================ ================================================ FILE: mobile/src/main/res/drawable/event_narrow_office_hours1.xml ================================================ ================================================ FILE: mobile/src/main/res/drawable/event_narrow_office_hours2.xml ================================================ ================================================ FILE: mobile/src/main/res/drawable/event_narrow_office_hours3.xml ================================================ ================================================ FILE: mobile/src/main/res/drawable/event_narrow_other.xml ================================================ ================================================ FILE: mobile/src/main/res/drawable/event_narrow_session1.xml ================================================ ================================================ FILE: mobile/src/main/res/drawable/event_narrow_session2.xml ================================================ ================================================ FILE: mobile/src/main/res/drawable/event_narrow_session3.xml ================================================ ================================================ FILE: mobile/src/main/res/drawable/event_narrow_session4.xml ================================================ ================================================ FILE: mobile/src/main/res/drawable/event_placeholder_keynote.xml ================================================ ================================================ FILE: mobile/src/main/res/drawable/event_placeholder_session1.xml ================================================ ================================================ FILE: mobile/src/main/res/drawable/event_placeholder_session2.xml ================================================ ================================================ FILE: mobile/src/main/res/drawable/event_placeholder_session3.xml ================================================ ================================================ FILE: mobile/src/main/res/drawable/event_placeholder_session4.xml ================================================ ================================================ FILE: mobile/src/main/res/drawable/fading_snackbar_background.xml ================================================ ================================================ FILE: mobile/src/main/res/drawable/filters_sheet_background.xml ================================================ ================================================ FILE: mobile/src/main/res/drawable/filters_sheet_header_shadow.xml ================================================ ================================================ FILE: mobile/src/main/res/drawable/generic_placeholder.xml ================================================ ================================================ FILE: mobile/src/main/res/drawable/hashtag_io19.xml ================================================ ================================================ FILE: mobile/src/main/res/drawable/ic_agenda_after_hours.xml ================================================ ================================================ FILE: mobile/src/main/res/drawable/ic_agenda_badge.xml ================================================ ================================================ FILE: mobile/src/main/res/drawable/ic_agenda_codelab.xml ================================================ ================================================ FILE: mobile/src/main/res/drawable/ic_agenda_concert.xml ================================================ ================================================ FILE: mobile/src/main/res/drawable/ic_agenda_keynote.xml ================================================ ================================================ FILE: mobile/src/main/res/drawable/ic_agenda_meal.xml ================================================ ================================================ FILE: mobile/src/main/res/drawable/ic_agenda_office_hours.xml ================================================ ================================================ FILE: mobile/src/main/res/drawable/ic_agenda_sandbox.xml ================================================ ================================================ FILE: mobile/src/main/res/drawable/ic_agenda_session.xml ================================================ ================================================ FILE: mobile/src/main/res/drawable/ic_agenda_store.xml ================================================ ================================================ FILE: mobile/src/main/res/drawable/ic_arrow_back.xml ================================================ ================================================ FILE: mobile/src/main/res/drawable/ic_arrow_right.xml ================================================ ================================================ FILE: mobile/src/main/res/drawable/ic_clear_all.xml ================================================ ================================================ FILE: mobile/src/main/res/drawable/ic_default_avatar_1.xml ================================================ ================================================ FILE: mobile/src/main/res/drawable/ic_default_avatar_2.xml ================================================ ================================================ FILE: mobile/src/main/res/drawable/ic_default_avatar_3.xml ================================================ ================================================ FILE: mobile/src/main/res/drawable/ic_default_profile_avatar.xml ================================================ ================================================ FILE: mobile/src/main/res/drawable/ic_expand_more.xml ================================================ ================================================ FILE: mobile/src/main/res/drawable/ic_feed_social_button_bg.xml ================================================ ================================================ FILE: mobile/src/main/res/drawable/ic_filter.xml ================================================ ================================================ FILE: mobile/src/main/res/drawable/ic_filter_clear.xml ================================================ ================================================ FILE: mobile/src/main/res/drawable/ic_launch.xml ================================================ ================================================ FILE: mobile/src/main/res/drawable/ic_layers.xml ================================================ ================================================ FILE: mobile/src/main/res/drawable/ic_login.xml ================================================ ================================================ FILE: mobile/src/main/res/drawable/ic_logo_assistant.xml ================================================ ================================================ FILE: mobile/src/main/res/drawable/ic_logo_components.xml ================================================ ================================================ FILE: mobile/src/main/res/drawable/ic_logo_facebook.xml ================================================ ================================================ FILE: mobile/src/main/res/drawable/ic_logo_google_developers.xml ================================================ ================================================ FILE: mobile/src/main/res/drawable/ic_logo_instagram.xml ================================================ ================================================ FILE: mobile/src/main/res/drawable/ic_logo_twitter.xml ================================================ ================================================ FILE: mobile/src/main/res/drawable/ic_logo_youtube.xml ================================================ ================================================ FILE: mobile/src/main/res/drawable/ic_logout.xml ================================================ ================================================ FILE: mobile/src/main/res/drawable/ic_map_after_dark.xml ================================================ ================================================ FILE: mobile/src/main/res/drawable/ic_map_concert.xml ================================================ ================================================ FILE: mobile/src/main/res/drawable/ic_map_daytime.xml ================================================ ================================================ FILE: mobile/src/main/res/drawable/ic_menu.xml ================================================ ================================================ FILE: mobile/src/main/res/drawable/ic_my_location.xml ================================================ ================================================ FILE: mobile/src/main/res/drawable/ic_nav_agenda.xml ================================================ ================================================ FILE: mobile/src/main/res/drawable/ic_nav_codelabs.xml ================================================ ================================================ FILE: mobile/src/main/res/drawable/ic_nav_home.xml ================================================ ================================================ FILE: mobile/src/main/res/drawable/ic_nav_info.xml ================================================ ================================================ FILE: mobile/src/main/res/drawable/ic_nav_map.xml ================================================ ================================================ FILE: mobile/src/main/res/drawable/ic_nav_schedule.xml ================================================ ================================================ FILE: mobile/src/main/res/drawable/ic_nav_settings.xml ================================================ ================================================ FILE: mobile/src/main/res/drawable/ic_nav_signpost.xml ================================================ ================================================ FILE: mobile/src/main/res/drawable/ic_play.xml ================================================ ================================================ FILE: mobile/src/main/res/drawable/ic_play_circle_outline.xml ================================================ ================================================ FILE: mobile/src/main/res/drawable/ic_question_answer.xml ================================================ ================================================ FILE: mobile/src/main/res/drawable/ic_reservable.xml ================================================ ================================================ FILE: mobile/src/main/res/drawable/ic_reservation.xml ================================================ ================================================ FILE: mobile/src/main/res/drawable/ic_reservation_disabled.xml ================================================ ================================================ FILE: mobile/src/main/res/drawable/ic_reservation_pending.xml ================================================ ================================================ FILE: mobile/src/main/res/drawable/ic_reserved.xml ================================================ ================================================ FILE: mobile/src/main/res/drawable/ic_search.xml ================================================ ================================================ FILE: mobile/src/main/res/drawable/ic_share.xml ================================================ ================================================ FILE: mobile/src/main/res/drawable/ic_sustainability_art.xml ================================================ ================================================ FILE: mobile/src/main/res/drawable/ic_tune.xml ================================================ ================================================ FILE: mobile/src/main/res/drawable/ic_waitlist_available.xml ================================================ ================================================ FILE: mobile/src/main/res/drawable/ic_waitlisted.xml ================================================ ================================================ FILE: mobile/src/main/res/drawable/io_logo_color.xml ================================================ ================================================ FILE: mobile/src/main/res/drawable/list_divider.xml ================================================ ================================================ FILE: mobile/src/main/res/drawable/map_marker_1.xml ================================================ ================================================ FILE: mobile/src/main/res/drawable/map_marker_2.xml ================================================ ================================================ FILE: mobile/src/main/res/drawable/map_marker_3.xml ================================================ ================================================ FILE: mobile/src/main/res/drawable/map_marker_4.xml ================================================ ================================================ FILE: mobile/src/main/res/drawable/map_marker_5.xml ================================================ ================================================ FILE: mobile/src/main/res/drawable/map_marker_6.xml ================================================ ================================================ FILE: mobile/src/main/res/drawable/map_marker_7.xml ================================================ ================================================ FILE: mobile/src/main/res/drawable/map_marker_8.xml ================================================ ================================================ FILE: mobile/src/main/res/drawable/map_marker_a.xml ================================================ ================================================ FILE: mobile/src/main/res/drawable/map_marker_b.xml ================================================ ================================================ FILE: mobile/src/main/res/drawable/map_marker_bike.xml ================================================ ================================================ FILE: mobile/src/main/res/drawable/map_marker_c.xml ================================================ ================================================ FILE: mobile/src/main/res/drawable/map_marker_charging.xml ================================================ ================================================ FILE: mobile/src/main/res/drawable/map_marker_d.xml ================================================ ================================================ FILE: mobile/src/main/res/drawable/map_marker_drink.xml ================================================ ================================================ FILE: mobile/src/main/res/drawable/map_marker_e.xml ================================================ ================================================ FILE: mobile/src/main/res/drawable/map_marker_f.xml ================================================ ================================================ FILE: mobile/src/main/res/drawable/map_marker_food.xml ================================================ ================================================ FILE: mobile/src/main/res/drawable/map_marker_g.xml ================================================ ================================================ FILE: mobile/src/main/res/drawable/map_marker_h.xml ================================================ ================================================ FILE: mobile/src/main/res/drawable/map_marker_handicap.xml ================================================ ================================================ FILE: mobile/src/main/res/drawable/map_marker_i.xml ================================================ ================================================ FILE: mobile/src/main/res/drawable/map_marker_info.xml ================================================ ================================================ FILE: mobile/src/main/res/drawable/map_marker_label_background.xml ================================================ ================================================ FILE: mobile/src/main/res/drawable/map_marker_lounge.xml ================================================ ================================================ FILE: mobile/src/main/res/drawable/map_marker_medical.xml ================================================ ================================================ FILE: mobile/src/main/res/drawable/map_marker_mothers_room.xml ================================================ ================================================ FILE: mobile/src/main/res/drawable/map_marker_parking.xml ================================================ ================================================ FILE: mobile/src/main/res/drawable/map_marker_restroom.xml ================================================ ================================================ FILE: mobile/src/main/res/drawable/map_marker_rideshare.xml ================================================ ================================================ FILE: mobile/src/main/res/drawable/map_marker_service_dog.xml ================================================ ================================================ FILE: mobile/src/main/res/drawable/map_marker_shuttle.xml ================================================ ================================================ FILE: mobile/src/main/res/drawable/map_marker_star.xml ================================================ ================================================ FILE: mobile/src/main/res/drawable/map_marker_store.xml ================================================ ================================================ FILE: mobile/src/main/res/drawable/map_marker_water.xml ================================================ ================================================ FILE: mobile/src/main/res/drawable/navigation_item_background.xml ================================================ ================================================ FILE: mobile/src/main/res/drawable/no_items_found_204.xml ================================================ ================================================ FILE: mobile/src/main/res/drawable/onboarding_io_19.xml ================================================ ================================================ FILE: mobile/src/main/res/drawable/onboarding_io_date_2019.xml ================================================ ================================================ FILE: mobile/src/main/res/drawable/onboarding_schedule.xml ================================================ ================================================ FILE: mobile/src/main/res/drawable/page_margin.xml ================================================ ================================================ FILE: mobile/src/main/res/drawable/preview_window.xml ================================================ ================================================ FILE: mobile/src/main/res/drawable/signal_wifi_off.xml ================================================ ================================================ FILE: mobile/src/main/res/drawable/tab_indicator.xml ================================================ ================================================ FILE: mobile/src/main/res/drawable/unrated_thumb.xml ================================================ ================================================ FILE: mobile/src/main/res/drawable-anydpi-v23/preview_window.xml ================================================ ================================================ FILE: mobile/src/main/res/drawable-anydpi-v23/preview_window_logo.xml ================================================ ================================================ FILE: mobile/src/main/res/layout/activity_main.xml ================================================ ================================================ FILE: mobile/src/main/res/layout/activity_onboarding.xml ================================================ ================================================ FILE: mobile/src/main/res/layout/activity_session_detail.xml ================================================ ================================================ FILE: mobile/src/main/res/layout/collapsible_card_content.xml ================================================ ================================================ FILE: mobile/src/main/res/layout/countdown.xml ================================================ ================================================ FILE: mobile/src/main/res/layout/dialog_schedule_hints.xml ================================================ ================================================ FILE: mobile/src/main/res/layout/dialog_sign_in.xml ================================================