├── .github ├── ci-gradle.properties └── workflows │ └── iosched.yaml ├── .gitignore ├── .idea ├── codeStyles │ └── codeStyleConfig.xml └── 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.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.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-anydpi-v23 │ │ ├── preview_window.xml │ │ └── preview_window_logo.xml │ │ ├── drawable-xxxhdpi │ │ └── preview_window_logo.png │ │ ├── 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 │ │ ├── layout-w500dp │ │ └── event_card_content.xml │ │ ├── layout-w720dp │ │ └── activity_main.xml │ │ ├── layout-w840dp │ │ └── item_codelab.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 │ │ ├── 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-ar-rEG │ │ └── strings.xml │ │ ├── values-ar-rSA │ │ └── strings.xml │ │ ├── values-ar │ │ └── strings.xml │ │ ├── values-de-rAT │ │ └── strings.xml │ │ ├── values-de-rCH │ │ └── strings.xml │ │ ├── values-de │ │ └── 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-rCH │ │ └── strings.xml │ │ ├── values-fr │ │ └── 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-rBR │ │ └── strings.xml │ │ ├── values-pt │ │ └── 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-rCN │ │ └── strings.xml │ │ ├── values-zh-rHK │ │ └── strings.xml │ │ ├── values-zh-rTW │ │ └── strings.xml │ │ ├── values-zh │ │ └── strings.xml │ │ └── values │ │ ├── attrs.xml │ │ ├── colors.xml │ │ ├── config.xml │ │ ├── dimens.xml │ │ ├── donottranslate.xml │ │ ├── ids.xml │ │ ├── strings.xml │ │ ├── styles.xml │ │ └── themes.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-ar-rEG │ │ └── strings.xml │ │ ├── values-ar-rSA │ │ └── strings.xml │ │ ├── values-ar │ │ └── strings.xml │ │ ├── values-de-rAT │ │ └── strings.xml │ │ ├── values-de-rCH │ │ └── strings.xml │ │ ├── values-de │ │ └── 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-rCH │ │ └── strings.xml │ │ ├── values-fr │ │ └── strings.xml │ │ ├── values-gsw │ │ └── strings.xml │ │ ├── values-it │ │ └── strings.xml │ │ ├── values-ja │ │ └── strings.xml │ │ ├── values-ko │ │ └── strings.xml │ │ ├── values-ln │ │ └── strings.xml │ │ ├── values-pt-rBR │ │ └── strings.xml │ │ ├── values-pt │ │ └── strings.xml │ │ ├── values-ru │ │ └── strings.xml │ │ ├── values-th │ │ └── strings.xml │ │ ├── values-vi │ │ └── strings.xml │ │ ├── values-zh-rCN │ │ └── strings.xml │ │ ├── values-zh-rHK │ │ └── strings.xml │ │ ├── values-zh-rTW │ │ └── strings.xml │ │ ├── values-zh │ │ └── strings.xml │ │ └── values │ │ └── strings.xml └── storelisting_zh-TW.txt ├── schedule.png ├── 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-v24 │ │ │ └── ic_launcher_foreground.xml │ │ ├── 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 │ │ ├── font │ │ │ ├── google_sans.xml │ │ │ └── google_sans_medium.xml │ │ ├── mipmap-anydpi-v26 │ │ │ └── ic_launcher.xml │ │ ├── mipmap-hdpi │ │ │ └── ic_launcher.png │ │ ├── mipmap-mdpi │ │ │ └── ic_launcher.png │ │ ├── mipmap-xhdpi │ │ │ └── ic_launcher.png │ │ ├── mipmap-xxhdpi │ │ │ └── ic_launcher.png │ │ ├── mipmap-xxxhdpi │ │ │ └── ic_launcher.png │ │ ├── values-ar-rEG │ │ │ └── strings.xml │ │ ├── values-ar-rSA │ │ │ └── strings.xml │ │ ├── values-ar │ │ │ └── strings.xml │ │ ├── values-de-rAT │ │ │ └── strings.xml │ │ ├── values-de-rCH │ │ │ └── strings.xml │ │ ├── values-de │ │ │ └── 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-rCH │ │ │ └── strings.xml │ │ ├── values-fr │ │ │ └── strings.xml │ │ ├── values-gsw │ │ │ └── strings.xml │ │ ├── values-it │ │ │ └── strings.xml │ │ ├── values-ja │ │ │ └── strings.xml │ │ ├── values-ko │ │ │ └── strings.xml │ │ ├── values-ln │ │ │ └── strings.xml │ │ ├── values-pt-rBR │ │ │ └── strings.xml │ │ ├── values-pt │ │ │ └── strings.xml │ │ ├── values-ru │ │ │ └── strings.xml │ │ ├── values-th │ │ │ └── strings.xml │ │ ├── values-vi │ │ │ └── strings.xml │ │ ├── values-zh-rCN │ │ │ └── strings.xml │ │ ├── values-zh-rHK │ │ │ └── strings.xml │ │ ├── values-zh-rTW │ │ │ └── strings.xml │ │ ├── values-zh │ │ │ └── strings.xml │ │ ├── values │ │ │ ├── colors.xml │ │ │ ├── dimens.xml │ │ │ ├── font_certs.xml │ │ │ ├── preloaded_fonts.xml │ │ │ └── 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 /.github/ci-gradle.properties: -------------------------------------------------------------------------------- 1 | # 2 | # Copyright 2020 The Android Open Source Project 3 | # 4 | # Licensed under the Apache License, Version 2.0 (the "License"); 5 | # you may not use this file except in compliance with the License. 6 | # You may obtain a copy of the License at 7 | # 8 | # http://www.apache.org/licenses/LICENSE-2.0 9 | # 10 | # Unless required by applicable law or agreed to in writing, software 11 | # distributed under the License is distributed on an "AS IS" BASIS, 12 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | # See the License for the specific language governing permissions and 14 | # limitations under the License. 15 | # 16 | 17 | org.gradle.daemon=false 18 | org.gradle.parallel=true 19 | org.gradle.jvmargs=-Xmx5120m 20 | org.gradle.workers.max=2 21 | 22 | kotlin.incremental=false 23 | kotlin.compiler.execution.strategy=in-process -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # built application files 2 | *.apk 3 | *.ap_ 4 | 5 | # files for the dex VM 6 | *.dex 7 | 8 | # Java class files 9 | *.class 10 | 11 | # generated files 12 | bin/ 13 | gen/ 14 | out/ 15 | build/ 16 | 17 | # Local configuration file (sdk path, etc) 18 | local.properties 19 | 20 | # Eclipse project files 21 | .classpath 22 | .project 23 | 24 | # Windows thumbnail db 25 | .DS_Store 26 | 27 | # IDEA/Android Studio project files, because 28 | # the project can be imported from settings.gradle.kts 29 | *.iml 30 | .idea/* 31 | !.idea/copyright 32 | !.idea/codeStyles/codeStyleConfig.xml 33 | 34 | # Gradle cache 35 | .gradle 36 | 37 | # Sandbox stuff 38 | _sandbox 39 | 40 | # Android Studio captures folder 41 | captures/ 42 | -------------------------------------------------------------------------------- /.idea/codeStyles/codeStyleConfig.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | -------------------------------------------------------------------------------- /.idea/copyright/iosched.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | -------------------------------------------------------------------------------- /.idea/copyright/profiles_settings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /androidTest-shared/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 16 | 17 | 19 | -------------------------------------------------------------------------------- /ar/consumer-proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Copyright 2019 Google LLC 2 | # 3 | # Licensed under the Apache License, Version 2.0 (the "License"); 4 | # you may not use this file except in compliance with the License. 5 | # You may obtain a copy of the License at 6 | # 7 | # https://www.apache.org/licenses/LICENSE-2.0 8 | # 9 | # Unless required by applicable law or agreed to in writing, software 10 | # distributed under the License is distributed on an "AS IS" BASIS, 11 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | # See the License for the specific language governing permissions and 13 | # limitations under the License. 14 | 15 | # Proguard configuration for the AR feature 16 | 17 | -keep class com.google.ar.web.** { *; } 18 | -dontwarn com.google.ar.web.** 19 | -------------------------------------------------------------------------------- /ar/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 17 | 18 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /ar/src/main/assets/images.imgdb: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/iosched/738e1e008096fad5f36612325275e80c33dbe436/ar/src/main/assets/images.imgdb -------------------------------------------------------------------------------- /ar/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 16 | 17 | 18 | 21 | 22 | -------------------------------------------------------------------------------- /benchmark/src/androidTest/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 17 | 20 | 21 | 22 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /benchmark/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 16 | 17 | 19 | -------------------------------------------------------------------------------- /buildSrc/build.gradle.kts: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2020 Google LLC 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * https://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | plugins { 18 | `kotlin-dsl` 19 | } 20 | 21 | repositories { 22 | gradlePluginPortal() 23 | } -------------------------------------------------------------------------------- /copyright.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright $YEAR Google LLC 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * https://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | -------------------------------------------------------------------------------- /debug.keystore: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/iosched/738e1e008096fad5f36612325275e80c33dbe436/debug.keystore -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/iosched/738e1e008096fad5f36612325275e80c33dbe436/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-7.4.2-bin.zip 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | -------------------------------------------------------------------------------- /kokoro/continuous.cfg: -------------------------------------------------------------------------------- 1 | # Location of the continuous bash script. 2 | build_file: "iosched/kokoro/continuous.sh" 3 | 4 | # Extra input files/directories for the build 5 | gfile_resources: "/x20/teams/iosched-android/keys" 6 | 7 | # Use Java 11 (b/181627163) 8 | # Copy a JDK 11 installation from x20 9 | gfile_resources: "/x20/projects/java-platform/linux-amd64/jdk-11-latest" 10 | 11 | env_vars { 12 | key: "GRADLE_DEBUG" 13 | value: "" 14 | } 15 | -------------------------------------------------------------------------------- /kokoro/continuous.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # Copyright 2018 Google LLC 4 | # 5 | # Licensed under the Apache License, Version 2.0 (the "License"); 6 | # you may not use this file except in compliance with the License. 7 | # You may obtain a copy of the License at 8 | # 9 | # https://www.apache.org/licenses/LICENSE-2.0 10 | # 11 | # Unless required by applicable law or agreed to in writing, software 12 | # distributed under the License is distributed on an "AS IS" BASIS, 13 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | # See the License for the specific language governing permissions and 15 | # limitations under the License. 16 | 17 | # Fail on any error. 18 | set -e 19 | # Display commands to stderr. 20 | set -x 21 | 22 | env | sort 23 | pwd 24 | find . 25 | git/iosched/kokoro/build.sh 26 | -------------------------------------------------------------------------------- /kokoro/presubmit.cfg: -------------------------------------------------------------------------------- 1 | # Location of the continuous bash script. 2 | build_file: "iosched/kokoro/presubmit.sh" 3 | 4 | # Extra input files/directories for the build 5 | gfile_resources: "/x20/teams/iosched-android/keys" 6 | 7 | # Use Java 11 (b/181627163) 8 | # Copy a JDK 11 installation from x20 9 | gfile_resources: "/x20/projects/java-platform/linux-amd64/jdk-11-latest" 10 | 11 | -------------------------------------------------------------------------------- /kokoro/presubmit.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # Copyright 2018 Google LLC 4 | # 5 | # Licensed under the Apache License, Version 2.0 (the "License"); 6 | # you may not use this file except in compliance with the License. 7 | # You may obtain a copy of the License at 8 | # 9 | # https://www.apache.org/licenses/LICENSE-2.0 10 | # 11 | # Unless required by applicable law or agreed to in writing, software 12 | # distributed under the License is distributed on an "AS IS" BASIS, 13 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | # See the License for the specific language governing permissions and 15 | # limitations under the License. 16 | 17 | # Fail on any error. 18 | set -e 19 | # Display commands to stderr. 20 | set -x 21 | 22 | env | sort 23 | pwd 24 | find . 25 | git/iosched/kokoro/build.sh 26 | -------------------------------------------------------------------------------- /macrobenchmark/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /macrobenchmark/consumer-rules.pro: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/iosched/738e1e008096fad5f36612325275e80c33dbe436/macrobenchmark/consumer-rules.pro -------------------------------------------------------------------------------- /macrobenchmark/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # You can control the set of applied configuration files using the 3 | # proguardFiles setting in build.gradle. 4 | # 5 | # For more details, see 6 | # http://developer.android.com/guide/developing/tools/proguard.html 7 | 8 | # If your project uses WebView with JS, uncomment the following 9 | # and specify the fully qualified class name to the JavaScript interface 10 | # class: 11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 12 | # public *; 13 | #} 14 | 15 | # Uncomment this to preserve the line number information for 16 | # debugging stack traces. 17 | #-keepattributes SourceFile,LineNumberTable 18 | 19 | # If you keep the line number information, uncomment this to 20 | # hide the original source file name. 21 | #-renamesourcefileattribute SourceFile -------------------------------------------------------------------------------- /macrobenchmark/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 16 | 17 | 20 | 21 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /mobile/proguard-rules-benchmark.pro: -------------------------------------------------------------------------------- 1 | # Copyright 2018 Google LLC 2 | # 3 | # Licensed under the Apache License, Version 2.0 (the "License"); 4 | # you may not use this file except in compliance with the License. 5 | # You may obtain a copy of the License at 6 | # 7 | # https://www.apache.org/licenses/LICENSE-2.0 8 | # 9 | # Unless required by applicable law or agreed to in writing, software 10 | # distributed under the License is distributed on an "AS IS" BASIS, 11 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | # See the License for the specific language governing permissions and 13 | # limitations under the License. 14 | 15 | # Obsfuscation must be disabled for the build variant that generates Baseline Profile, otherwise 16 | # wrong symbols would be generated. The generated Baseline Profile will be properly applied if generated 17 | # without obfuscation and your app is being obfuscated. 18 | -dontobfuscate -------------------------------------------------------------------------------- /mobile/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Copyright 2018 Google LLC 2 | # 3 | # Licensed under the Apache License, Version 2.0 (the "License"); 4 | # you may not use this file except in compliance with the License. 5 | # You may obtain a copy of the License at 6 | # 7 | # https://www.apache.org/licenses/LICENSE-2.0 8 | # 9 | # Unless required by applicable law or agreed to in writing, software 10 | # distributed under the License is distributed on an "AS IS" BASIS, 11 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | # See the License for the specific language governing permissions and 13 | # limitations under the License. 14 | 15 | # Glide 16 | -keep public class * implements com.bumptech.glide.module.GlideModule 17 | -keep public class * extends com.bumptech.glide.module.AppGlideModule 18 | -keep public enum com.bumptech.glide.load.ImageHeaderParser$** { 19 | **[] $VALUES; 20 | public *; 21 | } 22 | -keepattributes *Annotation* 23 | -keepattributes SourceFile,LineNumberTable 24 | -keep public class * extends java.lang.Exception 25 | -keep class com.crashlytics.** { *; } 26 | -dontwarn com.crashlytics.** 27 | 28 | # https://github.com/firebase/FirebaseUI-Android/issues/1429 29 | -keep class com.firebase.ui.auth.** { * ; } 30 | 31 | # Firebase Functions 32 | -keep class org.json.** { *; } 33 | -------------------------------------------------------------------------------- /mobile/sampledata/day_indicator.json: -------------------------------------------------------------------------------- 1 | { 2 | "comment": "Sample day indicators for use with tools:... attributes in layouts", 3 | "indicators": [ 4 | { 5 | "label": "May 7", 6 | "checked": false 7 | }, 8 | { 9 | "label": "May 8", 10 | "checked": true 11 | }, 12 | { 13 | "label": "May 9", 14 | "checked": false 15 | } 16 | ] 17 | } 18 | -------------------------------------------------------------------------------- /mobile/sampledata/map_variants.json: -------------------------------------------------------------------------------- 1 | { 2 | "comment": "Sample map variant data for use with tools:... attributes in layouts", 3 | "variants": [ 4 | { 5 | "title": "Daytime", 6 | "checked": true 7 | }, 8 | { 9 | "title": "After dark", 10 | "checked": false 11 | }, 12 | { 13 | "title": "Concert", 14 | "checked": false 15 | } 16 | ] 17 | } 18 | -------------------------------------------------------------------------------- /mobile/src/androidTest/java/com/google/samples/apps/iosched/tests/MainTestApplication.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2019 Google LLC 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * https://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | package com.google.samples.apps.iosched.tests 18 | 19 | import android.app.Application 20 | import com.jakewharton.threetenabp.AndroidThreeTen 21 | import timber.log.Timber 22 | 23 | /** 24 | * Used as a base application for Hilt to run instrumented tests through the [CustomTestRunner]. 25 | */ 26 | open class MainTestApplication : Application() { 27 | 28 | override fun onCreate() { 29 | // ThreeTenBP for times and dates, called before super to be available for objects 30 | AndroidThreeTen.init(this) 31 | Timber.plant(Timber.DebugTree()) 32 | super.onCreate() 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /mobile/src/main/java/com/google/samples/apps/iosched/MainApplication.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2018 Google LLC 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * https://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | package com.google.samples.apps.iosched 18 | 19 | import android.app.Application 20 | import dagger.hilt.android.HiltAndroidApp 21 | 22 | @HiltAndroidApp 23 | class MainApplication : Application() 24 | -------------------------------------------------------------------------------- /mobile/src/main/java/com/google/samples/apps/iosched/ui/SectionHeader.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2019 Google LLC 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * https://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | package com.google.samples.apps.iosched.ui 18 | 19 | import androidx.annotation.StringRes 20 | 21 | data class SectionHeader( 22 | @StringRes val titleId: Int, 23 | val useHorizontalPadding: Boolean = true 24 | ) 25 | -------------------------------------------------------------------------------- /mobile/src/main/java/com/google/samples/apps/iosched/ui/agenda/AgendaHeaderIndexer.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2018 Google LLC 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * https://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | package com.google.samples.apps.iosched.ui.agenda 18 | 19 | import com.google.samples.apps.iosched.model.Block 20 | import org.threeten.bp.ZonedDateTime 21 | 22 | /** 23 | * Find the first block of each day (rounded down to nearest day) and return pairs of 24 | * index to start time. Assumes that [agendaItems] are sorted by ascending start time. 25 | */ 26 | fun indexAgendaHeaders(agendaItems: List): List> { 27 | return agendaItems 28 | .mapIndexed { index, block -> index to block.startTime } 29 | .distinctBy { it.second.dayOfMonth } 30 | } 31 | -------------------------------------------------------------------------------- /mobile/src/main/java/com/google/samples/apps/iosched/ui/ar/ArCoreNotSupportedFragment.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2019 Google LLC 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * https://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | package com.google.samples.apps.iosched.ui.ar 18 | 19 | import android.os.Bundle 20 | import android.view.LayoutInflater 21 | import android.view.View 22 | import android.view.ViewGroup 23 | import androidx.fragment.app.Fragment 24 | import com.google.samples.apps.iosched.R 25 | 26 | class ArCoreNotSupportedFragment : Fragment() { 27 | 28 | override fun onCreateView( 29 | inflater: LayoutInflater, 30 | container: ViewGroup?, 31 | savedInstanceState: Bundle? 32 | ): View? { 33 | return inflater.inflate(R.layout.fragment_arcore_not_supported, container, false) 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /mobile/src/main/java/com/google/samples/apps/iosched/ui/ar/NoNetworkConnectionFragment.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2019 Google LLC 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * https://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | package com.google.samples.apps.iosched.ui.ar 18 | 19 | import android.os.Bundle 20 | import android.view.LayoutInflater 21 | import android.view.View 22 | import android.view.ViewGroup 23 | import androidx.fragment.app.Fragment 24 | import com.google.samples.apps.iosched.R 25 | 26 | class NoNetworkConnectionFragment : Fragment() { 27 | 28 | override fun onCreateView( 29 | inflater: LayoutInflater, 30 | container: ViewGroup?, 31 | savedInstanceState: Bundle? 32 | ): View? { 33 | return inflater.inflate(R.layout.fragment_no_network, container, false) 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /mobile/src/main/java/com/google/samples/apps/iosched/ui/codelabs/CodelabsActionsHandler.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2019 Google LLC 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * https://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | package com.google.samples.apps.iosched.ui.codelabs 18 | 19 | import com.google.samples.apps.iosched.model.Codelab 20 | 21 | interface CodelabsActionsHandler { 22 | 23 | fun dismissCodelabsInfoCard() 24 | 25 | fun openCodelabsOnMap() 26 | 27 | fun launchCodelabsWebsite() 28 | 29 | fun startCodelab(codelab: Codelab) 30 | } 31 | -------------------------------------------------------------------------------- /mobile/src/main/java/com/google/samples/apps/iosched/ui/schedule/ScheduleNavigationAction.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2021 Google LLC 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * https://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | package com.google.samples.apps.iosched.ui.schedule 18 | 19 | sealed class ScheduleNavigationAction { 20 | object NavigateToSignInDialogAction : ScheduleNavigationAction() 21 | object NavigateToSignOutDialogAction : ScheduleNavigationAction() 22 | object ShowScheduleUiHints : ScheduleNavigationAction() 23 | } 24 | -------------------------------------------------------------------------------- /mobile/src/main/java/com/google/samples/apps/iosched/ui/sessioncommon/EventActions.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2018 Google LLC 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * https://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | package com.google.samples.apps.iosched.ui.sessioncommon 18 | 19 | import com.google.samples.apps.iosched.model.SessionId 20 | import com.google.samples.apps.iosched.model.userdata.UserSession 21 | 22 | /** 23 | * Actions that can be performed on events. 24 | */ 25 | interface OnSessionClickListener { 26 | fun openEventDetail(id: SessionId) 27 | } 28 | 29 | interface OnSessionStarClickListener { 30 | fun onStarClicked(userSession: UserSession) 31 | } 32 | -------------------------------------------------------------------------------- /mobile/src/main/java/com/google/samples/apps/iosched/ui/theme/ThemeViewModel.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2019 Google LLC 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * https://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | package com.google.samples.apps.iosched.ui.theme 18 | 19 | import androidx.lifecycle.ViewModel 20 | import dagger.hilt.android.lifecycle.HiltViewModel 21 | import javax.inject.Inject 22 | 23 | /** 24 | * Thin ViewModel for themed Activities that don't have another ViewModel to use with 25 | * [ThemedActivityDelegate]. 26 | */ 27 | @HiltViewModel 28 | class ThemeViewModel @Inject constructor( 29 | themedActivityDelegate: ThemedActivityDelegate 30 | ) : ViewModel(), ThemedActivityDelegate by themedActivityDelegate 31 | -------------------------------------------------------------------------------- /mobile/src/main/java/com/google/samples/apps/iosched/ui/theme/ThemedActivityDelegateModule.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2019 Google LLC 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * https://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | package com.google.samples.apps.iosched.ui.theme 18 | 19 | import dagger.Binds 20 | import dagger.Module 21 | import dagger.hilt.InstallIn 22 | import dagger.hilt.components.SingletonComponent 23 | import javax.inject.Singleton 24 | 25 | @InstallIn(SingletonComponent::class) 26 | @Module 27 | @Suppress("UNUSED") 28 | abstract class ThemedActivityDelegateModule { 29 | 30 | @Singleton 31 | @Binds 32 | abstract fun provideThemedActivityDelegate( 33 | impl: ThemedActivityDelegateImpl 34 | ): ThemedActivityDelegate 35 | } 36 | -------------------------------------------------------------------------------- /mobile/src/main/java/com/google/samples/apps/iosched/util/CircularOutlineProvider.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2018 Google LLC 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * https://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | package com.google.samples.apps.iosched.util 18 | 19 | import android.graphics.Outline 20 | import android.view.View 21 | import android.view.ViewOutlineProvider 22 | 23 | object CircularOutlineProvider : ViewOutlineProvider() { 24 | override fun getOutline(view: View, outline: Outline) { 25 | outline.setOval( 26 | view.paddingLeft, 27 | view.paddingTop, 28 | view.width - view.paddingRight, 29 | view.height - view.paddingBottom 30 | ) 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /mobile/src/main/java/com/google/samples/apps/iosched/util/RecyclerViewExtensions.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2018 Google LLC 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * https://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | package com.google.samples.apps.iosched.util 18 | 19 | import androidx.recyclerview.widget.RecyclerView 20 | 21 | fun RecyclerView.clearDecorations() { 22 | if (itemDecorationCount > 0) { 23 | for (i in itemDecorationCount - 1 downTo 0) { 24 | removeItemDecorationAt(i) 25 | } 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /mobile/src/main/java/com/google/samples/apps/iosched/util/initializers/AndroidThreeTenInitializer.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2021 Google LLC 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * https://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | package com.google.samples.apps.iosched.util.initializers 18 | 19 | import android.content.Context 20 | import androidx.startup.Initializer 21 | import com.jakewharton.threetenabp.AndroidThreeTen 22 | 23 | class AndroidThreeTenInitializer : Initializer { 24 | 25 | override fun create(context: Context) { 26 | AndroidThreeTen.init(context) 27 | } 28 | 29 | override fun dependencies(): List>> = emptyList() 30 | } 31 | -------------------------------------------------------------------------------- /mobile/src/main/java/com/google/samples/apps/iosched/util/signin/SignInResult.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2018 Google LLC 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * https://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | package com.google.samples.apps.iosched.util.signin 18 | 19 | import com.firebase.ui.auth.FirebaseUiException 20 | 21 | sealed class SignInResult 22 | object SignInSuccess : SignInResult() 23 | data class SignInFailed(val error: FirebaseUiException?) : SignInResult() 24 | -------------------------------------------------------------------------------- /mobile/src/main/res/animator/active_alpha.xml: -------------------------------------------------------------------------------- 1 | 2 | 17 | 18 | 19 | 20 | 21 | 25 | 26 | 27 | 28 | 32 | 33 | 34 | 35 | -------------------------------------------------------------------------------- /mobile/src/main/res/color/chip_bg.xml: -------------------------------------------------------------------------------- 1 | 2 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /mobile/src/main/res/color/map_variant_icon.xml: -------------------------------------------------------------------------------- 1 | 2 | 17 | 18 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /mobile/src/main/res/color/map_variant_text.xml: -------------------------------------------------------------------------------- 1 | 2 | 17 | 18 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /mobile/src/main/res/color/navigation_item_background_tint.xml: -------------------------------------------------------------------------------- 1 | 2 | 17 | 18 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /mobile/src/main/res/color/schedule_day_indicator_text.xml: -------------------------------------------------------------------------------- 1 | 2 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /mobile/src/main/res/drawable-anydpi-v23/preview_window.xml: -------------------------------------------------------------------------------- 1 | 2 | 17 | 18 | 19 | 20 | 21 | 22 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /mobile/src/main/res/drawable-xxxhdpi/preview_window_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/iosched/738e1e008096fad5f36612325275e80c33dbe436/mobile/src/main/res/drawable-xxxhdpi/preview_window_logo.png -------------------------------------------------------------------------------- /mobile/src/main/res/drawable/bullet_small.xml: -------------------------------------------------------------------------------- 1 | 2 | 17 | 18 | 20 | 21 | 24 | 25 | -------------------------------------------------------------------------------- /mobile/src/main/res/drawable/chip_check.xml: -------------------------------------------------------------------------------- 1 | 2 | 17 | 22 | 26 | 27 | -------------------------------------------------------------------------------- /mobile/src/main/res/drawable/chip_dot.xml: -------------------------------------------------------------------------------- 1 | 2 | 17 | 22 | 26 | 27 | -------------------------------------------------------------------------------- /mobile/src/main/res/drawable/divider_empty_margin_normal.xml: -------------------------------------------------------------------------------- 1 | 2 | 17 | 18 | 20 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /mobile/src/main/res/drawable/divider_empty_margin_small.xml: -------------------------------------------------------------------------------- 1 | 2 | 17 | 18 | 20 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /mobile/src/main/res/drawable/divider_slash.xml: -------------------------------------------------------------------------------- 1 | 2 | 17 | 18 | 24 | 25 | 29 | 30 | 31 | -------------------------------------------------------------------------------- /mobile/src/main/res/drawable/event_narrow_app_reviews1.xml: -------------------------------------------------------------------------------- 1 | 16 | 17 | 22 | 26 | 30 | 31 | -------------------------------------------------------------------------------- /mobile/src/main/res/drawable/fading_snackbar_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 17 | 18 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /mobile/src/main/res/drawable/filters_sheet_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 17 | 18 | 20 | 21 | 24 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /mobile/src/main/res/drawable/filters_sheet_header_shadow.xml: -------------------------------------------------------------------------------- 1 | 2 | 17 | 18 | 20 | 24 | 25 | -------------------------------------------------------------------------------- /mobile/src/main/res/drawable/generic_placeholder.xml: -------------------------------------------------------------------------------- 1 | 2 | 17 | 18 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /mobile/src/main/res/drawable/ic_agenda_after_hours.xml: -------------------------------------------------------------------------------- 1 | 2 | 17 | 18 | 25 | 28 | 29 | -------------------------------------------------------------------------------- /mobile/src/main/res/drawable/ic_agenda_badge.xml: -------------------------------------------------------------------------------- 1 | 2 | 17 | 18 | 25 | 28 | 29 | -------------------------------------------------------------------------------- /mobile/src/main/res/drawable/ic_agenda_codelab.xml: -------------------------------------------------------------------------------- 1 | 2 | 17 | 18 | 25 | 28 | 29 | -------------------------------------------------------------------------------- /mobile/src/main/res/drawable/ic_agenda_concert.xml: -------------------------------------------------------------------------------- 1 | 2 | 17 | 18 | 25 | 28 | 29 | -------------------------------------------------------------------------------- /mobile/src/main/res/drawable/ic_agenda_keynote.xml: -------------------------------------------------------------------------------- 1 | 2 | 17 | 18 | 25 | 28 | 29 | -------------------------------------------------------------------------------- /mobile/src/main/res/drawable/ic_agenda_meal.xml: -------------------------------------------------------------------------------- 1 | 2 | 17 | 18 | 25 | 28 | 29 | -------------------------------------------------------------------------------- /mobile/src/main/res/drawable/ic_agenda_sandbox.xml: -------------------------------------------------------------------------------- 1 | 2 | 17 | 18 | 25 | 28 | 29 | -------------------------------------------------------------------------------- /mobile/src/main/res/drawable/ic_agenda_session.xml: -------------------------------------------------------------------------------- 1 | 2 | 17 | 18 | 25 | 28 | 29 | -------------------------------------------------------------------------------- /mobile/src/main/res/drawable/ic_agenda_store.xml: -------------------------------------------------------------------------------- 1 | 2 | 17 | 18 | 23 | 26 | 27 | -------------------------------------------------------------------------------- /mobile/src/main/res/drawable/ic_arrow_back.xml: -------------------------------------------------------------------------------- 1 | 2 | 17 | 18 | 25 | 28 | 29 | -------------------------------------------------------------------------------- /mobile/src/main/res/drawable/ic_arrow_right.xml: -------------------------------------------------------------------------------- 1 | 16 | 17 | 23 | 26 | 27 | -------------------------------------------------------------------------------- /mobile/src/main/res/drawable/ic_clear_all.xml: -------------------------------------------------------------------------------- 1 | 2 | 17 | 18 | 25 | 28 | 29 | -------------------------------------------------------------------------------- /mobile/src/main/res/drawable/ic_expand_more.xml: -------------------------------------------------------------------------------- 1 | 16 | 17 | 23 | 26 | 27 | -------------------------------------------------------------------------------- /mobile/src/main/res/drawable/ic_feed_social_button_bg.xml: -------------------------------------------------------------------------------- 1 | 2 | 17 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /mobile/src/main/res/drawable/ic_filter.xml: -------------------------------------------------------------------------------- 1 | 16 | 17 | 22 | 26 | 27 | -------------------------------------------------------------------------------- /mobile/src/main/res/drawable/ic_filter_clear.xml: -------------------------------------------------------------------------------- 1 | 2 | 17 | 18 | 23 | 27 | 28 | -------------------------------------------------------------------------------- /mobile/src/main/res/drawable/ic_launch.xml: -------------------------------------------------------------------------------- 1 | 16 | 17 | 23 | 26 | 27 | -------------------------------------------------------------------------------- /mobile/src/main/res/drawable/ic_layers.xml: -------------------------------------------------------------------------------- 1 | 16 | 17 | 23 | 26 | 27 | -------------------------------------------------------------------------------- /mobile/src/main/res/drawable/ic_login.xml: -------------------------------------------------------------------------------- 1 | 16 | 17 | 23 | 26 | 27 | -------------------------------------------------------------------------------- /mobile/src/main/res/drawable/ic_logo_facebook.xml: -------------------------------------------------------------------------------- 1 | 2 | 17 | 22 | 23 | 27 | 28 | -------------------------------------------------------------------------------- /mobile/src/main/res/drawable/ic_logout.xml: -------------------------------------------------------------------------------- 1 | 16 | 17 | 23 | 26 | 27 | -------------------------------------------------------------------------------- /mobile/src/main/res/drawable/ic_map_after_dark.xml: -------------------------------------------------------------------------------- 1 | 2 | 17 | 18 | 25 | 28 | 29 | -------------------------------------------------------------------------------- /mobile/src/main/res/drawable/ic_map_concert.xml: -------------------------------------------------------------------------------- 1 | 16 | 17 | 23 | 26 | 27 | -------------------------------------------------------------------------------- /mobile/src/main/res/drawable/ic_menu.xml: -------------------------------------------------------------------------------- 1 | 16 | 17 | 23 | 26 | 27 | -------------------------------------------------------------------------------- /mobile/src/main/res/drawable/ic_nav_agenda.xml: -------------------------------------------------------------------------------- 1 | 2 | 17 | 18 | 23 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /mobile/src/main/res/drawable/ic_nav_codelabs.xml: -------------------------------------------------------------------------------- 1 | 16 | 17 | 23 | 26 | 27 | -------------------------------------------------------------------------------- /mobile/src/main/res/drawable/ic_nav_home.xml: -------------------------------------------------------------------------------- 1 | 2 | 17 | 18 | 23 | 27 | 28 | -------------------------------------------------------------------------------- /mobile/src/main/res/drawable/ic_nav_info.xml: -------------------------------------------------------------------------------- 1 | 2 | 17 | 18 | 23 | 27 | 28 | -------------------------------------------------------------------------------- /mobile/src/main/res/drawable/ic_nav_map.xml: -------------------------------------------------------------------------------- 1 | 2 | 17 | 18 | 24 | 28 | 29 | -------------------------------------------------------------------------------- /mobile/src/main/res/drawable/ic_nav_schedule.xml: -------------------------------------------------------------------------------- 1 | 2 | 17 | 18 | 23 | 27 | 28 | -------------------------------------------------------------------------------- /mobile/src/main/res/drawable/ic_play.xml: -------------------------------------------------------------------------------- 1 | 2 | 17 | 18 | 24 | 27 | 28 | -------------------------------------------------------------------------------- /mobile/src/main/res/drawable/ic_play_circle_outline.xml: -------------------------------------------------------------------------------- 1 | 16 | 17 | 23 | 26 | 27 | -------------------------------------------------------------------------------- /mobile/src/main/res/drawable/ic_question_answer.xml: -------------------------------------------------------------------------------- 1 | 2 | 17 | 23 | 26 | 27 | -------------------------------------------------------------------------------- /mobile/src/main/res/drawable/ic_search.xml: -------------------------------------------------------------------------------- 1 | 16 | 17 | 24 | 27 | 28 | -------------------------------------------------------------------------------- /mobile/src/main/res/drawable/ic_tune.xml: -------------------------------------------------------------------------------- 1 | 16 | 17 | 23 | 26 | 27 | -------------------------------------------------------------------------------- /mobile/src/main/res/drawable/ic_waitlist_available.xml: -------------------------------------------------------------------------------- 1 | 2 | 17 | 18 | 24 | 28 | 29 | -------------------------------------------------------------------------------- /mobile/src/main/res/drawable/ic_waitlisted.xml: -------------------------------------------------------------------------------- 1 | 2 | 17 | 18 | 24 | 27 | 28 | -------------------------------------------------------------------------------- /mobile/src/main/res/drawable/list_divider.xml: -------------------------------------------------------------------------------- 1 | 2 | 15 | 17 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /mobile/src/main/res/drawable/map_marker_i.xml: -------------------------------------------------------------------------------- 1 | 16 | 17 | 22 | 25 | 28 | 31 | 32 | -------------------------------------------------------------------------------- /mobile/src/main/res/drawable/map_marker_label_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 17 | 18 | 20 | 21 | 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /mobile/src/main/res/drawable/page_margin.xml: -------------------------------------------------------------------------------- 1 | 2 | 17 | 19 | 20 | 21 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /mobile/src/main/res/drawable/preview_window.xml: -------------------------------------------------------------------------------- 1 | 2 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 26 | 27 | 28 | 29 | -------------------------------------------------------------------------------- /mobile/src/main/res/drawable/signal_wifi_off.xml: -------------------------------------------------------------------------------- 1 | 16 | 17 | 23 | 26 | 27 | -------------------------------------------------------------------------------- /mobile/src/main/res/drawable/tab_indicator.xml: -------------------------------------------------------------------------------- 1 | 2 | 17 | 18 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /mobile/src/main/res/drawable/unrated_thumb.xml: -------------------------------------------------------------------------------- 1 | 2 | 17 | 19 | 20 | 23 | 24 | -------------------------------------------------------------------------------- /mobile/src/main/res/layout/activity_onboarding.xml: -------------------------------------------------------------------------------- 1 | 2 | 17 | 18 | 25 | -------------------------------------------------------------------------------- /mobile/src/main/res/layout/activity_session_detail.xml: -------------------------------------------------------------------------------- 1 | 2 | 17 | 18 | 22 | -------------------------------------------------------------------------------- /mobile/src/main/res/layout/fragment_session_feedback.xml: -------------------------------------------------------------------------------- 1 | 16 | 17 | 18 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /mobile/src/main/res/layout/item_feed_announcements_empty.xml: -------------------------------------------------------------------------------- 1 | 2 | 17 | 18 | 25 | -------------------------------------------------------------------------------- /mobile/src/main/res/layout/item_feed_announcements_loading.xml: -------------------------------------------------------------------------------- 1 | 2 | 17 | 18 | 22 | -------------------------------------------------------------------------------- /mobile/src/main/res/layout/item_feed_countdown.xml: -------------------------------------------------------------------------------- 1 | 2 | 17 | 18 | 26 | 27 | -------------------------------------------------------------------------------- /mobile/src/main/res/layout/navigation_rail_header.xml: -------------------------------------------------------------------------------- 1 | 2 | 17 | 18 | 25 | -------------------------------------------------------------------------------- /mobile/src/main/res/menu/map_menu.xml: -------------------------------------------------------------------------------- 1 | 2 | 17 | 21 | 22 | 29 | 30 | 31 | -------------------------------------------------------------------------------- /mobile/src/main/res/menu/schedule_menu.xml: -------------------------------------------------------------------------------- 1 | 2 | 17 | 21 | 22 | 29 | 30 | 31 | -------------------------------------------------------------------------------- /mobile/src/main/res/menu/search_menu.xml: -------------------------------------------------------------------------------- 1 | 16 | 17 | 19 | 24 | 25 | -------------------------------------------------------------------------------- /mobile/src/main/res/transition/codelab_toggle.xml: -------------------------------------------------------------------------------- 1 | 2 | 17 | 18 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | -------------------------------------------------------------------------------- /mobile/src/main/res/transition/info_card_toggle.xml: -------------------------------------------------------------------------------- 1 | 2 | 17 | 18 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | -------------------------------------------------------------------------------- /mobile/src/main/res/transition/speaker_shared_enter.xml: -------------------------------------------------------------------------------- 1 | 2 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /mobile/src/main/res/values-h600dp/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 17 | 18 | 19 | 400dp 20 | 21 | -------------------------------------------------------------------------------- /mobile/src/main/res/values-land/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 17 | 18 | 19 | 20 | H,3:1 21 | 22 | -------------------------------------------------------------------------------- /mobile/src/main/res/values-ldrtl/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 17 | 18 | 19 | 20 | 100dp 21 | 0dp 22 | 8dp 23 | 0dp 24 | 25 | -------------------------------------------------------------------------------- /mobile/src/main/res/values-notnight-v23/colors.xml: -------------------------------------------------------------------------------- 1 | 2 | 17 | 18 | 19 | 20 | @color/system_ui_scrim_light 21 | 22 | -------------------------------------------------------------------------------- /mobile/src/main/res/values-notnight-v23/config.xml: -------------------------------------------------------------------------------- 1 | 2 | 17 | 18 | 19 | true 20 | -------------------------------------------------------------------------------- /mobile/src/main/res/values-notnight-v27/colors.xml: -------------------------------------------------------------------------------- 1 | 2 | 17 | 18 | 19 | 20 | @color/system_ui_scrim_light 21 | 22 | -------------------------------------------------------------------------------- /mobile/src/main/res/values-notnight-v27/config.xml: -------------------------------------------------------------------------------- 1 | 2 | 17 | 18 | 19 | true 20 | -------------------------------------------------------------------------------- /mobile/src/main/res/values-sw384dp/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 17 | 18 | 19 | 320dp 20 | 21 | -------------------------------------------------------------------------------- /mobile/src/main/res/values-v29/themes.xml: -------------------------------------------------------------------------------- 1 | 2 | 17 | 18 | 19 | 20 | 26 | -------------------------------------------------------------------------------- /mobile/src/main/res/values-w1024dp/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 17 | 18 | 19 | 0.6 20 | 21 | -------------------------------------------------------------------------------- /mobile/src/main/res/values-w500dp/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 17 | 18 | 19 | 20 | @dimen/wrap_content 21 | 72dp 22 | 0dp 23 | 48dp 24 | 25 | 26 | -------------------------------------------------------------------------------- /mobile/src/main/res/values-w600dp/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 17 | 18 | 19 | 0.8 20 | 21 | -------------------------------------------------------------------------------- /mobile/src/main/res/values-w840dp/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 17 | 18 | 19 | 0.7 20 | 21 | 1.0 22 | @dimen/spacing_normal 23 | 24 | -------------------------------------------------------------------------------- /mobile/src/main/res/values-w840dp/donottranslate.xml: -------------------------------------------------------------------------------- 1 | 2 | 17 | 18 | 19 | StaggeredGridLayoutManager 20 | 21 | -------------------------------------------------------------------------------- /mobile/src/main/res/values-w840dp/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 17 | 18 | 19 | 22 | 23 | -------------------------------------------------------------------------------- /mobile/src/main/res/values/config.xml: -------------------------------------------------------------------------------- 1 | 2 | 17 | 18 | 19 | false 20 | false 21 | -------------------------------------------------------------------------------- /mobile/src/main/res/values/donottranslate.xml: -------------------------------------------------------------------------------- 1 | 2 | 17 | 18 | 19 | M12,8l0,0c-2.21,0 -4,1.79 -4,4c0,2.21 1.79,4 4,4c2.21,0 4,-1.79 4,-4c0,-2.21 -1.79,-4 -4,-4l0,0z 20 | M9,16.2l-4.2,-4.2c0,0 -1.4,1.4 -1.4,1.4c0,0 5.6,5.6 5.6,5.6c0,0 12,-12 12,-12c0,0 -1.4,-1.4 -1.4,-1.4l-10.6,10.6z 21 | 22 | LinearLayoutManager 23 | 24 | -------------------------------------------------------------------------------- /mobile/src/staging/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 17 | 18 | 20 | 21 | 22 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /mobile/src/staging/java/com/google/samples/apps/iosched/test/HiltTestActivity.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2021 Google LLC 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * https://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | package com.google.samples.apps.iosched.test 18 | 19 | import androidx.appcompat.app.AppCompatActivity 20 | import dagger.hilt.android.AndroidEntryPoint 21 | 22 | @AndroidEntryPoint 23 | class HiltTestActivity : AppCompatActivity() 24 | -------------------------------------------------------------------------------- /mobile/src/test/java/com/google/samples/apps/iosched/test/util/fakes/FakeAnalyticsHelper.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2018 Google LLC 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * https://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | package com.google.samples.apps.iosched.test.util.fakes 18 | 19 | import android.app.Activity 20 | import com.google.samples.apps.iosched.shared.analytics.AnalyticsHelper 21 | 22 | class FakeAnalyticsHelper : AnalyticsHelper { 23 | override fun sendScreenView(screenName: String, activity: Activity) {} 24 | 25 | override fun logUiEvent(itemId: String, action: String) {} 26 | 27 | override fun setUserSignedIn(isSignedIn: Boolean) {} 28 | 29 | override fun setUserRegistered(isRegistered: Boolean) {} 30 | } 31 | -------------------------------------------------------------------------------- /mobile/src/test/java/com/google/samples/apps/iosched/test/util/fakes/FakeOnSessionStarClickDelegate.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2018 Google LLC 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * https://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | package com.google.samples.apps.iosched.test.util.fakes 18 | 19 | import com.google.samples.apps.iosched.model.userdata.UserSession 20 | import com.google.samples.apps.iosched.ui.sessioncommon.OnSessionStarClickDelegate 21 | import kotlinx.coroutines.flow.Flow 22 | 23 | class FakeOnSessionStarClickDelegate : OnSessionStarClickDelegate { 24 | 25 | override val navigateToSignInDialogEvents: Flow 26 | get() = TODO("Not implemented") 27 | 28 | override fun onStarClicked(userSession: UserSession) = TODO("Not implemented") 29 | } 30 | -------------------------------------------------------------------------------- /mobile/src/test/java/com/google/samples/apps/iosched/test/util/fakes/FakeThemedActivityDelegate.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2019 Google LLC 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * https://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | package com.google.samples.apps.iosched.test.util.fakes 18 | 19 | import com.google.samples.apps.iosched.model.Theme 20 | import com.google.samples.apps.iosched.ui.theme.ThemedActivityDelegate 21 | import kotlinx.coroutines.flow.MutableStateFlow 22 | import kotlinx.coroutines.flow.StateFlow 23 | 24 | class FakeThemedActivityDelegate( 25 | override val theme: StateFlow = MutableStateFlow(Theme.SYSTEM), 26 | override val currentTheme: Theme = Theme.SYSTEM 27 | ) : ThemedActivityDelegate 28 | -------------------------------------------------------------------------------- /mobile/src/test/java/com/google/samples/apps/iosched/ui/feed/TestAnnouncementDataSource.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2019 Google LLC 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * https://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | package com.google.samples.apps.iosched.ui.feed 18 | 19 | import com.google.samples.apps.iosched.model.Announcement 20 | import com.google.samples.apps.iosched.shared.data.feed.AnnouncementDataSource 21 | import com.google.samples.apps.iosched.test.data.TestData 22 | 23 | /** 24 | * Generates dummy session data to be used in tests. 25 | */ 26 | object TestAnnouncementDataSource : AnnouncementDataSource { 27 | 28 | override fun getAnnouncements(): List = TestData.announcements 29 | } 30 | -------------------------------------------------------------------------------- /mobile/src/test/java/com/google/samples/apps/iosched/ui/feed/TestMomentDataSource.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2019 Google LLC 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * https://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | package com.google.samples.apps.iosched.ui.feed 18 | 19 | import com.google.samples.apps.iosched.model.Moment 20 | import com.google.samples.apps.iosched.shared.data.feed.MomentDataSource 21 | import com.google.samples.apps.iosched.test.data.TestData 22 | 23 | /** 24 | * Generates dummy moments data to be used in tests. 25 | */ 26 | object TestMomentDataSource : MomentDataSource { 27 | 28 | override fun getMoments(): List = TestData.moments 29 | } 30 | -------------------------------------------------------------------------------- /model/build.gradle.kts: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2020 Google LLC 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * https://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | plugins { 18 | id("java-library") 19 | kotlin("jvm") 20 | } 21 | 22 | dependencies { 23 | api(platform(project(":depconstraints"))) 24 | 25 | implementation(fileTree(mapOf("dir" to "libs", "include" to listOf("*.jar")))) 26 | // ThreeTenBP for the shared module only. Date and time API for Java. 27 | api("org.threeten:threetenbp:${Versions.THREETENBP}:no-tzdb") 28 | implementation(Libs.CORE_KTX) 29 | 30 | implementation(Libs.KOTLIN_STDLIB) 31 | } 32 | 33 | java { 34 | sourceCompatibility = JavaVersion.VERSION_1_7 35 | targetCompatibility = JavaVersion.VERSION_1_7 36 | } 37 | -------------------------------------------------------------------------------- /model/src/main/java/com/google/samples/apps/iosched/model/ConferenceData.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2018 Google LLC 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * https://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | package com.google.samples.apps.iosched.model 18 | 19 | /** 20 | * Contains schedule data with the UI models. 21 | */ 22 | data class ConferenceData( 23 | val sessions: List, 24 | val speakers: List, 25 | val rooms: List, 26 | val codelabs: List, 27 | val tags: List, 28 | val version: Int 29 | ) 30 | -------------------------------------------------------------------------------- /model/src/main/java/com/google/samples/apps/iosched/model/ConferenceDay.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2018 Google LLC 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * https://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | package com.google.samples.apps.iosched.model 18 | 19 | import org.threeten.bp.ZonedDateTime 20 | 21 | data class ConferenceDay( 22 | val start: ZonedDateTime, 23 | val end: ZonedDateTime 24 | ) { 25 | operator fun contains(session: Session) = start <= session.startTime && end >= session.endTime 26 | } 27 | -------------------------------------------------------------------------------- /model/src/main/java/com/google/samples/apps/iosched/model/ConferenceWifiInfo.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2018 Google LLC 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * https://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | package com.google.samples.apps.iosched.model 18 | 19 | data class ConferenceWifiInfo(val ssid: String, val password: String) 20 | -------------------------------------------------------------------------------- /model/src/main/java/com/google/samples/apps/iosched/model/Room.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2018 Google LLC 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * https://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | package com.google.samples.apps.iosched.model 18 | 19 | /** 20 | * Describes a venue associated with the conference. 21 | */ 22 | data class Room( 23 | /** 24 | * Unique string identifying this room. 25 | */ 26 | val id: String, 27 | 28 | /** 29 | * The name of the room. 30 | */ 31 | val name: String 32 | ) { 33 | val abbreviatedName 34 | get() = name.split("|")[0] 35 | } 36 | -------------------------------------------------------------------------------- /model/src/main/java/com/google/samples/apps/iosched/model/Theme.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2019 Google LLC 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * https://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | package com.google.samples.apps.iosched.model 18 | 19 | /** 20 | * Represents the available UI themes for the application 21 | */ 22 | enum class Theme(val storageKey: String) { 23 | LIGHT("light"), 24 | DARK("dark"), 25 | SYSTEM("system"), 26 | BATTERY_SAVER("battery_saver") 27 | } 28 | 29 | /** 30 | * Returns the matching [Theme] for the given [storageKey] value. 31 | */ 32 | fun themeFromStorageKey(storageKey: String): Theme? { 33 | return Theme.values().firstOrNull { it.storageKey == storageKey } 34 | } 35 | -------------------------------------------------------------------------------- /model/src/main/java/com/google/samples/apps/iosched/model/filters/Filter.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2020 Google LLC 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * https://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | package com.google.samples.apps.iosched.model.filters 18 | 19 | import com.google.samples.apps.iosched.model.ConferenceDay 20 | import com.google.samples.apps.iosched.model.Tag 21 | 22 | sealed class Filter { 23 | 24 | data class TagFilter(val tag: Tag) : Filter() 25 | 26 | data class DateFilter(val day: ConferenceDay) : Filter() 27 | 28 | object MyScheduleFilter : Filter() 29 | } 30 | -------------------------------------------------------------------------------- /model/src/main/java/com/google/samples/apps/iosched/model/userdata/UserSession.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2018 Google LLC 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * https://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | package com.google.samples.apps.iosched.model.userdata 18 | 19 | import com.google.samples.apps.iosched.model.Session 20 | import com.google.samples.apps.iosched.model.SessionType 21 | 22 | /** 23 | * Wrapper class to hold the [Session] and associating [UserEvent]. 24 | */ 25 | data class UserSession( 26 | val session: Session, 27 | val userEvent: UserEvent 28 | ) { 29 | 30 | fun isPostSessionNotificationRequired(): Boolean { 31 | return userEvent.isReserved() && 32 | !userEvent.isReviewed && 33 | session.type == SessionType.SESSION 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /playstore/listing_zh-rCN.txt: -------------------------------------------------------------------------------- 1 | Your store listing text is now localized. To make this available on Google Play store, you will need to submit this content on Google Developer Console. 2 | ******************** Short description in locale ******************** 3 | 您的I/O大会导航助手,不管您是亲临现场或远程参与都能为您提供帮助。 4 | ******************** Full description in locale ******************** 5 | Google I/O 2016官方应用程序旨在成为您的I/O大会导航助手,不管您是亲临现场或远程参与都能为您提供帮助。 6 | -- 探索会议日程,了解主题、话题和演讲者的详细信息 7 | -- 添加活动到个性化的日程表 8 | -- 在日程表中的活动开始之前收到提醒 9 | -- 观看主题演讲和活动现场直播 10 | -- 在您的所有设备和I/O网站之间同步您的日程表 11 | -- 使用向量式大会地图为自己指引路线 12 | -- 关注I/O相关的公共社交对话 13 | -- 在视频中查看往年的I/O内容 14 | 15 | *亲临大会现场参与者专享:* 16 | - 利用在大会前预先配置的WiFi网络 17 | 18 | 这款应用程序针对各种形状和尺寸的手机及平板电脑进行了优化。 19 | 应用程序的源代码将在I/O后不久发布。 20 | 21 | v4.0:Google I/O 2016更新 22 | ******************** Title in locale ******************** 23 | Google I/O 2016 -------------------------------------------------------------------------------- /playstore/src/main/res/values-ja/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 17 | 18 | 19 | 現地での参加、リモートでの参加を問わず、I/O をナビゲートしてくれるアシスタントです。 20 | 21 | Google I/O 2018 用の更新\n• イベントの座席を事前に予約する\n• イベント、来場方法の詳細、よくある質問に関する重要な情報を見る 22 | 必要な権限 23 | オプションの権限 24 | 位置情報: ユーザーの現在地周辺の会場の地図を表示するために必要です。 25 | 26 | -------------------------------------------------------------------------------- /playstore/src/main/res/values-ko/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 17 | 18 | 19 | 직접 참석하거나 온라인으로 참여 시 이 앱으로 I/O를 둘러볼 수 있습니다. 20 | 21 | Google I/O 2018에 맞게 업데이트되었습니다.\n• 일정보다 앞서 이벤트 좌석 예약\n• 이벤트, 이동 정보, FAQ에 대한 중요 정보 읽기 22 | 필수 권한 23 | 선택 권한 24 | 위치 정보: 사용자 위치 주변의 이벤트 장소 지도를 표시하는 데 필요합니다. 25 | 26 | -------------------------------------------------------------------------------- /playstore/src/main/res/values-zh-rCN/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 17 | 18 | 19 | 无论您是亲临会议还是远程参加,都可以可协助您了解 I/O 大会。 20 | 21 | 更新 2018 年 Google I/O 大会相关信息\n• 提前预约活动席位\n• 了解有关活动的重要信息、交通方式详情和常见问题解答。 22 | 所需权限 23 | 可选权限 24 | 位置信息:需要获取位置信息,以便显示用户所在位置周围的场地地图。 25 | 26 | -------------------------------------------------------------------------------- /playstore/src/main/res/values-zh-rHK/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 17 | 18 | 19 | 不論是親臨 I/O 大會現場或以遠端方式參加,這款應用程式都是你的最佳導航幫手。 20 | 21 | 更新 2018 年 Google I/O 大會相關訊息\n• 可事先預約活動席位\n• 可查看有關大會活動的重要資訊、交通方式詳細資訊和常見問題。 22 | 必要權限 23 | 選用權限 24 | 位置資訊:授予這項權限後,應用程式即可顯示使用者所在位置一帶的會場地圖。 25 | 26 | -------------------------------------------------------------------------------- /playstore/src/main/res/values-zh-rTW/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 17 | 18 | 19 | 不論是親臨 I/O 大會現場或以遠端方式參加,這款應用程式都是你的最佳導航幫手。 20 | 21 | 更新 2018 年 Google I/O 大會相關訊息\n• 可事先預約活動席位\n• 可查看有關大會活動的重要資訊、交通方式詳細資訊和常見問題。 22 | 必要權限 23 | 選用權限 24 | 位置資訊:授予這項權限後,應用程式即可顯示使用者所在位置一帶的會場地圖。 25 | 26 | -------------------------------------------------------------------------------- /playstore/src/main/res/values-zh/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 17 | 18 | 19 | 无论您是亲临会议还是远程参加,都可以可协助您了解 I/O 大会。 20 | 21 | 更新 2018 年 Google I/O 大会相关信息\n• 提前预约活动席位\n• 了解有关活动的重要信息、交通方式详情和常见问题解答。 22 | 所需权限 23 | 可选权限 24 | 位置信息:需要获取位置信息,以便显示用户所在位置周围的场地地图。 25 | 26 | -------------------------------------------------------------------------------- /playstore/storelisting_zh-TW.txt: -------------------------------------------------------------------------------- 1 | Your store listing text is now localized. To make this available on Google Play store, you will need to submit this content on Google Developer Console. 2 | ******************** Short description in locale ******************** 3 | 您的I/O大會導航助手,不管您是親臨現場或遠端參與都能為您提供幫助。 4 | ******************** Title in locale ******************** 5 | Google I/O 2016 6 | ******************** Full description in locale ******************** 7 | Google I/O 2016官方應用程式旨在成為您的I/O大會導航助手,不管您是親臨現場或遠端參與都能為您提供幫助。 8 | -- 探索會議日程,瞭解主題、話題和演講者的詳細資訊 9 | -- 新增活動到個性化的日程表 10 | -- 在日程表中的活動開始之前收到提醒 11 | -- 觀看主題演講和活動現場直播 12 | -- 在您的所有裝置和I/O網站之間同步您的日程表 13 | -- 使用向量式大會地圖為自己指引路線 14 | -- 關注I/O相關的公共社交對話 15 | -- 在影片中檢視往年的I/O內容 16 | 17 | *親臨大會現場參與者專享:* 18 | - 利用在大會前預先設定的WiFi網路 19 | 20 | 這款應用程式針對各種形狀和尺寸的手機及平板電腦進行了最佳化。 21 | 應用程式的原始程式碼將在I/O後不久發佈。 22 | 23 | v4.0:Google I/O 2016更新 -------------------------------------------------------------------------------- /schedule.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/iosched/738e1e008096fad5f36612325275e80c33dbe436/schedule.png -------------------------------------------------------------------------------- /settings.gradle.kts: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2018 Google LLC 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * https://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | include( 18 | ":mobile", 19 | ":shared", 20 | ":test-shared", 21 | ":model", 22 | ":androidTest-shared", 23 | "ar", 24 | "benchmark", 25 | "depconstraints", 26 | ":macrobenchmark" 27 | ) 28 | -------------------------------------------------------------------------------- /shared/src/main/java/com/google/samples/apps/iosched/shared/data/ConferenceDataSource.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2018 Google LLC 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * https://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | package com.google.samples.apps.iosched.shared.data 18 | 19 | import com.google.samples.apps.iosched.model.ConferenceData 20 | 21 | interface ConferenceDataSource { 22 | fun getRemoteConferenceData(): ConferenceData? 23 | fun getOfflineConferenceData(): ConferenceData? 24 | } 25 | 26 | enum class UpdateSource { 27 | NONE, 28 | NETWORK, 29 | CACHE, 30 | BOOTSTRAP 31 | } 32 | -------------------------------------------------------------------------------- /shared/src/main/java/com/google/samples/apps/iosched/shared/data/FirestoreExtensions.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2019 Google LLC 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * https://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | package com.google.samples.apps.iosched.shared.data 18 | 19 | import com.google.firebase.firestore.DocumentReference 20 | import com.google.firebase.firestore.FirebaseFirestore 21 | 22 | fun FirebaseFirestore.document2020(): DocumentReference = 23 | // This is a prefix for Firestore document for this year 24 | collection("google_io_events").document("2020") 25 | -------------------------------------------------------------------------------- /shared/src/main/java/com/google/samples/apps/iosched/shared/data/codelabs/CodelabsRepository.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2019 Google LLC 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * https://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | package com.google.samples.apps.iosched.shared.data.codelabs 18 | 19 | import com.google.samples.apps.iosched.model.Codelab 20 | import com.google.samples.apps.iosched.shared.data.ConferenceDataRepository 21 | import javax.inject.Inject 22 | import javax.inject.Singleton 23 | 24 | @Singleton 25 | open class CodelabsRepository @Inject constructor( 26 | private val conferenceDataRepository: ConferenceDataRepository 27 | ) { 28 | fun getCodelabs(): List = conferenceDataRepository.getOfflineConferenceData().codelabs 29 | } 30 | -------------------------------------------------------------------------------- /shared/src/main/java/com/google/samples/apps/iosched/shared/data/db/CodelabFtsDao.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2019 Google LLC 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * https://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | package com.google.samples.apps.iosched.shared.data.db 18 | 19 | import androidx.room.Dao 20 | import androidx.room.Insert 21 | import androidx.room.OnConflictStrategy 22 | import androidx.room.Query 23 | 24 | /** 25 | * The Data Access Object for the [CodelabFtsEntity] class. 26 | */ 27 | @Dao 28 | interface CodelabFtsDao { 29 | @Insert(onConflict = OnConflictStrategy.REPLACE) 30 | fun insertAll(codelabs: List) 31 | 32 | @Query("SELECT codelabId FROM codelabsFts WHERE codelabsFts MATCH :query") 33 | fun searchAllCodelabs(query: String): List 34 | } 35 | -------------------------------------------------------------------------------- /shared/src/main/java/com/google/samples/apps/iosched/shared/data/db/SessionFtsDao.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2019 Google LLC 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * https://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | package com.google.samples.apps.iosched.shared.data.db 18 | 19 | import androidx.room.Dao 20 | import androidx.room.Insert 21 | import androidx.room.OnConflictStrategy 22 | import androidx.room.Query 23 | 24 | /** 25 | * The Data Access Object for the [SessionFtsEntity] class. 26 | */ 27 | @Dao 28 | interface SessionFtsDao { 29 | @Insert(onConflict = OnConflictStrategy.REPLACE) 30 | fun insertAll(sessions: List) 31 | 32 | @Query("SELECT sessionId FROM sessionsFts WHERE sessionsFts MATCH :query") 33 | fun searchAllSessions(query: String): List 34 | } 35 | -------------------------------------------------------------------------------- /shared/src/main/java/com/google/samples/apps/iosched/shared/data/db/SpeakerFtsDao.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2019 Google LLC 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * https://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | package com.google.samples.apps.iosched.shared.data.db 18 | 19 | import androidx.room.Dao 20 | import androidx.room.Insert 21 | import androidx.room.OnConflictStrategy 22 | import androidx.room.Query 23 | 24 | /** 25 | * The Data Access Object for the [SpeakerFtsEntity] class. 26 | */ 27 | @Dao 28 | interface SpeakerFtsDao { 29 | @Insert(onConflict = OnConflictStrategy.REPLACE) 30 | fun insertAll(speakers: List) 31 | 32 | @Query("SELECT speakerId FROM speakersFts WHERE speakersFts MATCH :query") 33 | fun searchAllSpeakers(query: String): List 34 | } 35 | -------------------------------------------------------------------------------- /shared/src/main/java/com/google/samples/apps/iosched/shared/data/session/json/ColorDeserializer.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2018 Google LLC 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * https://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | package com.google.samples.apps.iosched.shared.data.session.json 18 | 19 | import android.graphics.Color 20 | import com.google.samples.apps.iosched.shared.util.ColorUtils 21 | import timber.log.Timber 22 | 23 | fun parseColor(colorString: String?): Int { 24 | return if (colorString != null) { 25 | try { 26 | ColorUtils.parseHexColor(colorString) 27 | } catch (t: Throwable) { 28 | Timber.d(t, "Failed to parse color") 29 | Color.TRANSPARENT 30 | } 31 | } else { 32 | Color.TRANSPARENT 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /shared/src/main/java/com/google/samples/apps/iosched/shared/data/session/json/DeserializerUtils.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2019 Google LLC 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * https://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | package com.google.samples.apps.iosched.shared.data.session.json 18 | 19 | import com.google.gson.JsonObject 20 | 21 | internal fun getListFromJsonArray(obj: JsonObject, key: String): List { 22 | val array = obj.get(key).asJsonArray 23 | return array.map { it.asString } 24 | } 25 | -------------------------------------------------------------------------------- /shared/src/main/java/com/google/samples/apps/iosched/shared/data/signin/datasources/AuthIdDataSource.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2018 Google LLC 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * https://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | package com.google.samples.apps.iosched.shared.data.signin.datasources 18 | 19 | /** 20 | * Interface to simply get the current authenticated user ID. 21 | */ 22 | interface AuthIdDataSource { 23 | fun getUserId(): String? 24 | } 25 | -------------------------------------------------------------------------------- /shared/src/main/java/com/google/samples/apps/iosched/shared/data/signin/datasources/RegisteredUserDataSource.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2018 Google LLC 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * https://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | package com.google.samples.apps.iosched.shared.data.signin.datasources 18 | 19 | import com.google.samples.apps.iosched.shared.result.Result 20 | import kotlinx.coroutines.flow.Flow 21 | 22 | /** 23 | * A data source that listens to changes in the user data related to event 24 | * registration. 25 | */ 26 | interface RegisteredUserDataSource { 27 | /** 28 | * Returns the holder of the result of listening to the data source. 29 | */ 30 | fun observeUserChanges(userId: String): Flow> 31 | } 32 | -------------------------------------------------------------------------------- /shared/src/main/java/com/google/samples/apps/iosched/shared/data/tag/TagDataSource.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2018 Google LLC 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * https://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | package com.google.samples.apps.iosched.shared.data.tag 18 | 19 | import com.google.samples.apps.iosched.model.Tag 20 | 21 | interface TagDataSource { 22 | fun getTags(): List 23 | } 24 | -------------------------------------------------------------------------------- /shared/src/main/java/com/google/samples/apps/iosched/shared/data/tag/TagRepository.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2018 Google LLC 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * https://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | package com.google.samples.apps.iosched.shared.data.tag 18 | 19 | import com.google.samples.apps.iosched.model.Tag 20 | import com.google.samples.apps.iosched.shared.data.ConferenceDataRepository 21 | import javax.inject.Inject 22 | import javax.inject.Singleton 23 | 24 | /** 25 | * Single point of access to tag data for the presentation layer. 26 | */ 27 | @Singleton 28 | open class TagRepository @Inject constructor( 29 | private val conferenceDataRepository: ConferenceDataRepository 30 | ) { 31 | fun getTags(): List = conferenceDataRepository.getOfflineConferenceData().tags 32 | } 33 | -------------------------------------------------------------------------------- /shared/src/main/java/com/google/samples/apps/iosched/shared/di/CoroutinesQualifiers.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2019 Google LLC 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * https://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | package com.google.samples.apps.iosched.shared.di 18 | 19 | import javax.inject.Qualifier 20 | 21 | @Retention(AnnotationRetention.BINARY) 22 | @Qualifier 23 | annotation class DefaultDispatcher 24 | 25 | @Retention(AnnotationRetention.BINARY) 26 | @Qualifier 27 | annotation class IoDispatcher 28 | 29 | @Retention(AnnotationRetention.BINARY) 30 | @Qualifier 31 | annotation class MainDispatcher 32 | 33 | @Retention(AnnotationRetention.BINARY) 34 | @Qualifier 35 | annotation class MainImmediateDispatcher 36 | 37 | @Retention(AnnotationRetention.BINARY) 38 | @Qualifier 39 | annotation class ApplicationScope 40 | -------------------------------------------------------------------------------- /shared/src/main/java/com/google/samples/apps/iosched/shared/di/MainThreadHandler.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2019 Google LLC 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * https://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | package com.google.samples.apps.iosched.shared.di 18 | 19 | import javax.inject.Qualifier 20 | 21 | @Qualifier 22 | @Target( 23 | AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY_GETTER, 24 | AnnotationTarget.PROPERTY_SETTER, AnnotationTarget.FIELD, 25 | AnnotationTarget.VALUE_PARAMETER 26 | ) 27 | annotation class MainThreadHandler 28 | -------------------------------------------------------------------------------- /shared/src/main/java/com/google/samples/apps/iosched/shared/domain/ar/ArConstants.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2019 Google LLC 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * https://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | package com.google.samples.apps.iosched.shared.domain.ar 18 | 19 | object ArConstants { 20 | const val PINNED_SESSIONS_JSON_KEY = "pinned_sessions_json" 21 | const val CAN_SIGNED_IN_USER_DEMO_AR = "can_demo_ar" 22 | } 23 | -------------------------------------------------------------------------------- /shared/src/main/java/com/google/samples/apps/iosched/shared/domain/search/Searchable.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2019 Google LLC 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * https://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | package com.google.samples.apps.iosched.shared.domain.search 18 | 19 | import com.google.samples.apps.iosched.model.Codelab 20 | import com.google.samples.apps.iosched.model.Session 21 | import com.google.samples.apps.iosched.model.Speaker 22 | 23 | /** 24 | * Sealed class that represents searchable contents. 25 | */ 26 | sealed class Searchable { 27 | 28 | class SearchedSession(val session: Session) : Searchable() 29 | class SearchedSpeaker(val speaker: Speaker) : Searchable() 30 | class SearchedCodelab(val codelab: Codelab) : Searchable() 31 | } 32 | -------------------------------------------------------------------------------- /shared/src/main/java/com/google/samples/apps/iosched/shared/domain/sessions/GetConferenceDaysUseCase.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2018 Google LLC 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * https://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | package com.google.samples.apps.iosched.shared.domain.sessions 18 | 19 | import com.google.samples.apps.iosched.model.ConferenceDay 20 | import com.google.samples.apps.iosched.shared.data.ConferenceDataRepository 21 | import javax.inject.Inject 22 | 23 | class GetConferenceDaysUseCase @Inject constructor( 24 | private val conferenceDataRepository: ConferenceDataRepository 25 | ) { 26 | operator fun invoke(): List { 27 | return conferenceDataRepository.getConferenceDays() 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /shared/src/main/java/com/google/samples/apps/iosched/shared/util/SpeakerUtils.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2018 Google LLC 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * https://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | package com.google.samples.apps.iosched.shared.util 18 | 19 | import com.google.samples.apps.iosched.model.Speaker 20 | 21 | object SpeakerUtils { 22 | 23 | fun alphabeticallyOrderedSpeakerList(speakerSet: Set) = 24 | ArrayList(speakerSet).sortedBy { it.name } 25 | } 26 | -------------------------------------------------------------------------------- /shared/src/main/res/drawable/ic_event.xml: -------------------------------------------------------------------------------- 1 | 2 | 17 | 23 | 26 | 27 | -------------------------------------------------------------------------------- /shared/src/main/res/drawable/ic_launcher_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 17 | 18 | 23 | 26 | 32 | 33 | -------------------------------------------------------------------------------- /shared/src/main/res/drawable/ic_livestreamed.xml: -------------------------------------------------------------------------------- 1 | 2 | 17 | 18 | 24 | 27 | 28 | -------------------------------------------------------------------------------- /shared/src/main/res/drawable/ic_star.xml: -------------------------------------------------------------------------------- 1 | 2 | 17 | 18 | 24 | 27 | 28 | -------------------------------------------------------------------------------- /shared/src/main/res/drawable/ic_star_border.xml: -------------------------------------------------------------------------------- 1 | 16 | 17 | 23 | 26 | 27 | -------------------------------------------------------------------------------- /shared/src/main/res/drawable/tag_dot.xml: -------------------------------------------------------------------------------- 1 | 16 | 17 | 19 | 20 | 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /shared/src/main/res/mipmap-anydpi-v26/ic_launcher.xml: -------------------------------------------------------------------------------- 1 | 2 | 17 | 18 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /shared/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/iosched/738e1e008096fad5f36612325275e80c33dbe436/shared/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /shared/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/iosched/738e1e008096fad5f36612325275e80c33dbe436/shared/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /shared/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/iosched/738e1e008096fad5f36612325275e80c33dbe436/shared/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /shared/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/iosched/738e1e008096fad5f36612325275e80c33dbe436/shared/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /shared/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/iosched/738e1e008096fad5f36612325275e80c33dbe436/shared/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /shared/src/main/res/values/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 17 | 18 | 19 | 8dp 20 | 21 | -------------------------------------------------------------------------------- /shared/src/main/res/values/preloaded_fonts.xml: -------------------------------------------------------------------------------- 1 | 2 | 17 | 18 | 19 | 20 | @font/google_sans 21 | 22 | 23 | -------------------------------------------------------------------------------- /shared/src/staging/java/com/google/samples/apps/iosched/shared/data/FakeFeedbackEndpoint.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2019 Google LLC 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * https://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | package com.google.samples.apps.iosched.shared.data 18 | 19 | import com.google.samples.apps.iosched.model.SessionId 20 | import com.google.samples.apps.iosched.shared.data.feedback.FeedbackEndpoint 21 | import com.google.samples.apps.iosched.shared.result.Result 22 | 23 | object FakeFeedbackEndpoint : FeedbackEndpoint { 24 | 25 | override suspend fun sendFeedback( 26 | sessionId: SessionId, 27 | responses: Map 28 | ): Result { 29 | return Result.Success(Unit) 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /shared/src/staging/java/com/google/samples/apps/iosched/shared/data/ar/FakeArDebugFlagEndpoint.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2019 Google LLC 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * https://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | package com.google.samples.apps.iosched.shared.data.ar 18 | 19 | object FakeArDebugFlagEndpoint : ArDebugFlagEndpoint { 20 | 21 | override suspend fun canDemoAr(): Boolean { 22 | return true 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /shared/src/staging/java/com/google/samples/apps/iosched/shared/fcm/StagingTopicSubscriber.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2018 Google LLC 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * https://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | package com.google.samples.apps.iosched.shared.fcm 18 | 19 | class StagingTopicSubscriber : TopicSubscriber { 20 | override fun subscribeToScheduleUpdates() { 21 | // No-op 22 | } 23 | 24 | override fun subscribeToAttendeeUpdates() { 25 | // No-op 26 | } 27 | 28 | override fun unsubscribeFromAttendeeUpdates() { 29 | // No-op 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /shared/src/test/java/com/google/samples/apps/iosched/shared/domain/feed/TestAnnouncementDataSource.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2019 Google LLC 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * https://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | package com.google.samples.apps.iosched.shared.domain.feed 18 | 19 | import com.google.samples.apps.iosched.model.Announcement 20 | import com.google.samples.apps.iosched.shared.data.feed.AnnouncementDataSource 21 | import com.google.samples.apps.iosched.test.data.TestData 22 | 23 | object TestAnnouncementDataSource : AnnouncementDataSource { 24 | 25 | override fun getAnnouncements(): List = TestData.announcements 26 | } 27 | -------------------------------------------------------------------------------- /shared/src/test/java/com/google/samples/apps/iosched/shared/domain/feed/TestMomentDataSource.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2019 Google LLC 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * https://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | package com.google.samples.apps.iosched.shared.domain.feed 18 | 19 | import com.google.samples.apps.iosched.model.Moment 20 | import com.google.samples.apps.iosched.shared.data.feed.MomentDataSource 21 | import com.google.samples.apps.iosched.test.data.TestData 22 | 23 | /** 24 | * Generates dummy moments data to be used in tests. 25 | */ 26 | object TestMomentDataSource : MomentDataSource { 27 | 28 | override fun getMoments(): List = TestData.moments 29 | } 30 | -------------------------------------------------------------------------------- /shared/src/test/resources/malformed_conference_data.json: -------------------------------------------------------------------------------- 1 | // MALFORMED JSON 2 | { 3 | "object": {} 4 | -------------------------------------------------------------------------------- /test-shared/build.gradle.kts: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2020 Google LLC 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * https://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | plugins { 18 | id("java-library") 19 | kotlin("jvm") 20 | } 21 | 22 | dependencies { 23 | api(platform(project(":depconstraints"))) 24 | implementation(project(":model")) 25 | // Kotlin 26 | implementation(Libs.KOTLIN_STDLIB) 27 | 28 | // Test 29 | implementation(Libs.JUNIT) 30 | api(Libs.COROUTINES_TEST) 31 | 32 | // ThreeTenBP for the shared module only. Date and time API for Java. 33 | testImplementation(Libs.THREETENBP) 34 | compileOnly("org.threeten:threetenbp:${Versions.THREETENBP}:no-tzdb") 35 | } 36 | --------------------------------------------------------------------------------