gitextract_kj3p27ku/ ├── .editorconfig ├── .gitattributes ├── .github/ │ ├── scripts/ │ │ └── mac-disk-cleanup.sh │ └── workflows/ │ ├── baseline-profile.yml │ ├── build.yml │ ├── gradle-wrapper.yaml │ └── todo.yml ├── .gitignore ├── .idea/ │ ├── checkstyle-idea.xml │ ├── codeStyles/ │ │ ├── Project.xml │ │ └── codeStyleConfig.xml │ ├── copyright/ │ │ ├── Chris_Banes_Apache_v2.xml │ │ ├── Google_Apache_v2_0.xml │ │ └── profiles_settings.xml │ ├── dictionaries/ │ │ ├── chris.xml │ │ └── chrisbanes.xml │ ├── encodings.xml │ ├── inspectionProfiles/ │ │ ├── ktlint.xml │ │ └── profiles_settings.xml │ ├── kotlinc.xml │ └── vcs.xml ├── .ruby-version ├── .swiftlint.yml ├── .xcode-version ├── Gemfile ├── LICENSE ├── README.md ├── android-app/ │ ├── app/ │ │ ├── benchmark-rules.pro │ │ ├── build.gradle.kts │ │ ├── proguard-rules-chucker.pro │ │ ├── proguard-rules.pro │ │ └── src/ │ │ ├── androidTest/ │ │ │ └── kotlin/ │ │ │ └── app/ │ │ │ └── tivi/ │ │ │ ├── screenshots/ │ │ │ │ └── Screenshots.kt │ │ │ └── test/ │ │ │ └── smoke/ │ │ │ └── SmokeTest.kt │ │ ├── debug/ │ │ │ ├── AndroidManifest.xml │ │ │ └── res/ │ │ │ └── values/ │ │ │ ├── colors.xml │ │ │ └── strings.xml │ │ ├── main/ │ │ │ ├── AndroidManifest.xml │ │ │ ├── generated/ │ │ │ │ └── baselineProfiles/ │ │ │ │ ├── baseline-prof.txt │ │ │ │ └── startup-prof.txt │ │ │ ├── kotlin/ │ │ │ │ └── app/ │ │ │ │ └── tivi/ │ │ │ │ ├── TiviActivity.kt │ │ │ │ ├── TiviApplication.kt │ │ │ │ └── home/ │ │ │ │ └── MainActivity.kt │ │ │ └── res/ │ │ │ ├── drawable-anydpi-v26/ │ │ │ │ ├── ic_launcher_background.xml │ │ │ │ └── ic_launcher_foreground.xml │ │ │ ├── mipmap-anydpi-v26/ │ │ │ │ └── ic_launcher.xml │ │ │ ├── values/ │ │ │ │ ├── colors.xml │ │ │ │ ├── strings.xml │ │ │ │ ├── sys_ui.xml │ │ │ │ └── themes.xml │ │ │ ├── values-night/ │ │ │ │ ├── colors.xml │ │ │ │ ├── sys_ui.xml │ │ │ │ └── themes.xml │ │ │ ├── values-notnight-v27/ │ │ │ │ └── sys_ui.xml │ │ │ ├── values-v29/ │ │ │ │ └── themes.xml │ │ │ └── xml/ │ │ │ ├── backup_rules.xml │ │ │ └── data_extraction_rules.xml │ │ └── qa/ │ │ └── res/ │ │ └── values/ │ │ └── leak_canary.xml │ ├── benchmark/ │ │ ├── build.gradle.kts │ │ └── src/ │ │ └── main/ │ │ └── kotlin/ │ │ └── app/ │ │ └── tivi/ │ │ └── benchmark/ │ │ ├── BaselineProfileGenerator.kt │ │ ├── StartupBenchmark.kt │ │ └── Utils.kt │ └── common-test/ │ ├── build.gradle.kts │ └── src/ │ └── main/ │ └── kotlin/ │ └── app/ │ └── tivi/ │ └── app/ │ └── test/ │ └── AppScenarios.kt ├── api/ │ ├── tmdb/ │ │ ├── build.gradle.kts │ │ └── src/ │ │ ├── commonMain/ │ │ │ └── kotlin/ │ │ │ └── app/ │ │ │ └── tivi/ │ │ │ └── tmdb/ │ │ │ ├── TmdbComponent.kt │ │ │ ├── TmdbImageSizes.kt │ │ │ ├── TmdbImageUrlProvider.kt │ │ │ ├── TmdbInitializer.kt │ │ │ ├── TmdbManager.kt │ │ │ └── TmdbOAuthInfo.kt │ │ ├── iosMain/ │ │ │ └── kotlin/ │ │ │ └── app/ │ │ │ └── tivi/ │ │ │ └── tmdb/ │ │ │ └── TmdbPlatformComponent.kt │ │ └── jvmMain/ │ │ └── kotlin/ │ │ └── app/ │ │ └── tivi/ │ │ └── tmdb/ │ │ └── TmdbPlatformComponent.kt │ └── trakt/ │ ├── build.gradle.kts │ └── src/ │ ├── commonMain/ │ │ └── kotlin/ │ │ └── app/ │ │ └── tivi/ │ │ └── trakt/ │ │ ├── Anticipated.kt │ │ ├── TiviTrakt.kt │ │ └── TraktComponent.kt │ ├── iosMain/ │ │ └── kotlin/ │ │ └── app/ │ │ └── tivi/ │ │ └── trakt/ │ │ └── TraktPlatformComponent.kt │ └── jvmMain/ │ └── kotlin/ │ └── app/ │ └── tivi/ │ └── trakt/ │ └── TraktPlatformComponent.kt ├── art/ │ ├── theme-baseline.sketch │ └── tivi-art.sketch ├── build.gradle.kts ├── common/ │ ├── imageloading/ │ │ ├── build.gradle.kts │ │ └── src/ │ │ ├── androidMain/ │ │ │ └── kotlin/ │ │ │ └── app/ │ │ │ └── tivi/ │ │ │ └── common/ │ │ │ └── imageloading/ │ │ │ └── ImageLoadingPlatformComponent.kt │ │ ├── commonMain/ │ │ │ └── kotlin/ │ │ │ └── app/ │ │ │ └── tivi/ │ │ │ └── common/ │ │ │ └── imageloading/ │ │ │ ├── EpisodeImageModelInterceptor.kt │ │ │ ├── HideArtworkInterceptor.kt │ │ │ ├── ImageLoader.kt │ │ │ ├── ImageLoaderCleanupInitializer.kt │ │ │ ├── ImageLoadingComponent.kt │ │ │ ├── SeasonImageModelInterceptor.kt │ │ │ ├── ShowImageModelInterceptor.kt │ │ │ └── TmdbImageEntityCoilInterceptor.kt │ │ ├── iosMain/ │ │ │ └── kotlin/ │ │ │ └── app/ │ │ │ └── tivi/ │ │ │ └── common/ │ │ │ └── imageloading/ │ │ │ └── ImageLoadingPlatformComponent.kt │ │ └── jvmMain/ │ │ └── kotlin/ │ │ └── app/ │ │ └── tivi/ │ │ └── common/ │ │ └── imageloading/ │ │ └── ImageLoadingPlatformComponent.kt │ └── ui/ │ ├── circuit/ │ │ ├── build.gradle.kts │ │ ├── lint-baseline.xml │ │ └── src/ │ │ └── commonMain/ │ │ └── kotlin/ │ │ └── app/ │ │ └── tivi/ │ │ ├── EventSink.kt │ │ ├── navigation/ │ │ │ ├── DeepLinker.kt │ │ │ └── LocalNavigator.kt │ │ └── overlays/ │ │ ├── BottomSheetOverlay.kt │ │ └── DialogOverlay.kt │ ├── compose/ │ │ ├── build.gradle.kts │ │ ├── lint-baseline.xml │ │ └── src/ │ │ ├── androidMain/ │ │ │ └── kotlin/ │ │ │ └── app/ │ │ │ └── tivi/ │ │ │ └── common/ │ │ │ └── compose/ │ │ │ ├── Coil.kt │ │ │ ├── ColorExtractor.android.kt │ │ │ ├── ReportDrawnWhen.kt │ │ │ ├── theme/ │ │ │ │ └── Platform.kt │ │ │ └── ui/ │ │ │ └── Icon.android.kt │ │ ├── commonMain/ │ │ │ └── kotlin/ │ │ │ └── app/ │ │ │ └── tivi/ │ │ │ └── common/ │ │ │ └── compose/ │ │ │ ├── ColorExtractor.kt │ │ │ ├── EntryGrid.kt │ │ │ ├── HazeScaffold.kt │ │ │ ├── Layout.kt │ │ │ ├── LazyList.kt │ │ │ ├── LazyPagingExtensions.kt │ │ │ ├── LogCompositions.kt │ │ │ ├── Modifier.kt │ │ │ ├── NestedScaffold.kt │ │ │ ├── ReportDrawnWhen.kt │ │ │ ├── RetainedCoroutineScope.kt │ │ │ ├── TiviCompositionLocals.kt │ │ │ ├── TiviPreferenceExtensions.kt │ │ │ ├── UiMessage.kt │ │ │ ├── WindowSizeClass.kt │ │ │ ├── theme/ │ │ │ │ ├── Color.kt │ │ │ │ ├── Platform.kt │ │ │ │ ├── Shape.kt │ │ │ │ ├── Theme.kt │ │ │ │ └── Type.kt │ │ │ └── ui/ │ │ │ ├── AppBar.kt │ │ │ ├── AutoSizedCircularProgressIndicator.kt │ │ │ ├── Backdrop.kt │ │ │ ├── BackdropCard.kt │ │ │ ├── Clickable.kt │ │ │ ├── DateTimeDialogs.kt │ │ │ ├── DateTimeTextFields.kt │ │ │ ├── Empty.kt │ │ │ ├── ExpandingSummary.kt │ │ │ ├── GradientScrim.kt │ │ │ ├── Icon.kt │ │ │ ├── IconButtonScrim.kt │ │ │ ├── Image.kt │ │ │ ├── LoadingButton.kt │ │ │ ├── PaddingValues.kt │ │ │ ├── Position.kt │ │ │ ├── PosterCard.kt │ │ │ ├── Preference.kt │ │ │ ├── RefreshButton.kt │ │ │ ├── SearchTextField.kt │ │ │ ├── SortChip.kt │ │ │ ├── SortMenuPopup.kt │ │ │ ├── Surface.kt │ │ │ ├── UserProfileButton.kt │ │ │ └── WindowInsets.kt │ │ ├── iosMain/ │ │ │ └── kotlin/ │ │ │ └── app/ │ │ │ └── tivi/ │ │ │ └── common/ │ │ │ └── compose/ │ │ │ ├── Coil.kt │ │ │ ├── ColorExtractor.ios.kt │ │ │ ├── ReportDrawnWhen.kt │ │ │ ├── theme/ │ │ │ │ └── Platform.kt │ │ │ └── ui/ │ │ │ ├── DateTimeDialogs.kt │ │ │ ├── Icon.ios.kt │ │ │ └── Sheets.kt │ │ ├── jvmCommon/ │ │ │ └── kotlin/ │ │ │ └── app/ │ │ │ └── tivi/ │ │ │ └── common/ │ │ │ └── compose/ │ │ │ └── ui/ │ │ │ └── DateTimeDialogs.kt │ │ └── jvmMain/ │ │ └── kotlin/ │ │ └── app/ │ │ └── tivi/ │ │ └── common/ │ │ └── compose/ │ │ ├── Coil.kt │ │ ├── ColorExtractor.jvm.kt │ │ ├── ReportDrawnWhen.kt │ │ ├── theme/ │ │ │ └── Platform.kt │ │ └── ui/ │ │ └── Icon.jvm.kt │ ├── resources/ │ │ ├── build.gradle.kts │ │ └── src/ │ │ ├── androidMain/ │ │ │ └── kotlin/ │ │ │ └── app/ │ │ │ └── tivi/ │ │ │ └── util/ │ │ │ ├── String.kt │ │ │ ├── TiviDateFormatter.kt │ │ │ └── TiviTextCreator.kt │ │ ├── commonMain/ │ │ │ ├── composeResources/ │ │ │ │ └── values/ │ │ │ │ └── strings.xml │ │ │ └── kotlin/ │ │ │ └── app/ │ │ │ └── tivi/ │ │ │ ├── common/ │ │ │ │ └── ui/ │ │ │ │ └── resources/ │ │ │ │ ├── Fonts.kt │ │ │ │ └── Resources.kt │ │ │ └── util/ │ │ │ ├── GenreStringer.kt │ │ │ ├── String.kt │ │ │ ├── TiviDateFormatter.kt │ │ │ └── TiviTextCreator.kt │ │ ├── iosMain/ │ │ │ └── kotlin/ │ │ │ └── app/ │ │ │ └── tivi/ │ │ │ └── util/ │ │ │ ├── String.kt │ │ │ ├── TiviDateFormatter.kt │ │ │ └── TiviTextCreator.kt │ │ └── jvmMain/ │ │ └── kotlin/ │ │ └── app/ │ │ └── tivi/ │ │ └── util/ │ │ ├── String.kt │ │ ├── TiviDateFormatter.kt │ │ └── TiviTextCreator.kt │ └── screens/ │ ├── build.gradle.kts │ └── src/ │ └── commonMain/ │ └── kotlin/ │ └── app/ │ └── tivi/ │ └── screens/ │ ├── Parcelize.kt │ └── Screens.kt ├── compose-stability.conf ├── core/ │ ├── analytics/ │ │ ├── build.gradle.kts │ │ └── src/ │ │ ├── androidMain/ │ │ │ └── kotlin/ │ │ │ └── app/ │ │ │ └── tivi/ │ │ │ └── core/ │ │ │ └── analytics/ │ │ │ ├── AnalyticsPlatformComponent.kt │ │ │ └── TiviFirebaseAnalytics.kt │ │ ├── commonMain/ │ │ │ └── kotlin/ │ │ │ └── app/ │ │ │ └── tivi/ │ │ │ └── core/ │ │ │ └── analytics/ │ │ │ ├── Analytics.kt │ │ │ ├── AnalyticsComponent.kt │ │ │ └── AnalyticsInitializer.kt │ │ ├── iosMain/ │ │ │ └── kotlin/ │ │ │ └── app/ │ │ │ └── tivi/ │ │ │ └── core/ │ │ │ └── analytics/ │ │ │ └── AnalyticsPlatformComponent.kt │ │ └── jvmMain/ │ │ └── kotlin/ │ │ └── app/ │ │ └── tivi/ │ │ └── core/ │ │ └── analytics/ │ │ └── AnalyticsPlatformComponent.kt │ ├── base/ │ │ ├── build.gradle.kts │ │ └── src/ │ │ └── commonMain/ │ │ └── kotlin/ │ │ └── app/ │ │ └── tivi/ │ │ ├── animations/ │ │ │ └── Lerp.kt │ │ ├── app/ │ │ │ └── ApplicationInfo.kt │ │ ├── appinitializers/ │ │ │ └── AppInitializer.kt │ │ ├── base/ │ │ │ └── InvokeStatus.kt │ │ ├── extensions/ │ │ │ └── Lazy.kt │ │ ├── inject/ │ │ │ └── Scopes.kt │ │ └── util/ │ │ ├── AppCoroutineDispatchers.kt │ │ ├── Collections.kt │ │ ├── CoroutineContext.kt │ │ └── Result.kt │ ├── logging/ │ │ ├── build.gradle.kts │ │ └── src/ │ │ ├── androidMain/ │ │ │ ├── AndroidManifest.xml │ │ │ └── kotlin/ │ │ │ └── app/ │ │ │ └── tivi/ │ │ │ └── util/ │ │ │ ├── AndroidSetCrashReportingEnabledAction.kt │ │ │ ├── CrashlyticsAndroidInitializer.kt │ │ │ └── LoggerPlatformComponent.kt │ │ ├── commonMain/ │ │ │ └── kotlin/ │ │ │ └── app/ │ │ │ └── tivi/ │ │ │ └── util/ │ │ │ ├── CrashReportingInitializer.kt │ │ │ ├── KermitInitializer.kt │ │ │ ├── LoggerComponent.kt │ │ │ ├── RecordingLoggerWriter.kt │ │ │ └── SetCrashReportingEnabledAction.kt │ │ ├── iosMain/ │ │ │ └── kotlin/ │ │ │ └── app/ │ │ │ └── tivi/ │ │ │ └── util/ │ │ │ ├── CrashlyticsIosInitializer.kt │ │ │ └── LoggerPlatformComponent.kt │ │ ├── jvmMain/ │ │ │ └── kotlin/ │ │ │ └── app/ │ │ │ └── tivi/ │ │ │ └── util/ │ │ │ └── LoggerPlatformComponent.kt │ │ └── mobileMain/ │ │ └── kotlin/ │ │ └── app/ │ │ └── tivi/ │ │ └── util/ │ │ └── CrashlyticsLoggerWriter.kt │ ├── notifications/ │ │ ├── core/ │ │ │ ├── build.gradle.kts │ │ │ └── src/ │ │ │ ├── androidMain/ │ │ │ │ ├── AndroidManifest.xml │ │ │ │ ├── kotlin/ │ │ │ │ │ └── app/ │ │ │ │ │ └── tivi/ │ │ │ │ │ └── core/ │ │ │ │ │ └── notifications/ │ │ │ │ │ ├── AndroidNotificationManager.kt │ │ │ │ │ ├── NotificationPlatformComponent.kt │ │ │ │ │ ├── PendingNotificationStore.kt │ │ │ │ │ └── PostNotificationBroadcastReceiver.kt │ │ │ │ └── res/ │ │ │ │ └── drawable/ │ │ │ │ └── outline_tv_gen_24.xml │ │ │ ├── commonMain/ │ │ │ │ └── kotlin/ │ │ │ │ └── app/ │ │ │ │ └── tivi/ │ │ │ │ └── core/ │ │ │ │ └── notifications/ │ │ │ │ ├── NotificationManager.kt │ │ │ │ └── NotificationsComponent.kt │ │ │ ├── iosMain/ │ │ │ │ └── kotlin/ │ │ │ │ └── app/ │ │ │ │ └── tivi/ │ │ │ │ └── core/ │ │ │ │ └── notifications/ │ │ │ │ ├── IosNotificationManager.kt │ │ │ │ └── NotificationPlatformComponent.kt │ │ │ └── jvmMain/ │ │ │ └── kotlin/ │ │ │ └── app/ │ │ │ └── tivi/ │ │ │ └── core/ │ │ │ └── notifications/ │ │ │ ├── EmptyNotificationManager.kt │ │ │ └── NotificationPlatformComponent.kt │ │ └── protos/ │ │ ├── build.gradle.kts │ │ └── src/ │ │ └── commonMain/ │ │ └── proto/ │ │ └── pending.proto │ ├── performance/ │ │ ├── build.gradle.kts │ │ └── src/ │ │ ├── androidMain/ │ │ │ └── kotlin/ │ │ │ └── app/ │ │ │ └── tivi/ │ │ │ └── core/ │ │ │ └── perf/ │ │ │ ├── AndroidTracer.kt │ │ │ └── PerformanceComponent.kt │ │ ├── commonMain/ │ │ │ └── kotlin/ │ │ │ └── app/ │ │ │ └── tivi/ │ │ │ └── core/ │ │ │ └── perf/ │ │ │ ├── PerformanceComponent.kt │ │ │ └── Tracer.kt │ │ ├── iosMain/ │ │ │ └── kotlin/ │ │ │ └── app/ │ │ │ └── tivi/ │ │ │ └── core/ │ │ │ └── perf/ │ │ │ └── PerformanceComponent.kt │ │ └── jvmMain/ │ │ └── kotlin/ │ │ └── app/ │ │ └── tivi/ │ │ └── core/ │ │ └── perf/ │ │ └── PerformanceComponent.kt │ ├── permissions/ │ │ ├── build.gradle.kts │ │ └── src/ │ │ ├── androidMain/ │ │ │ └── kotlin/ │ │ │ └── app/ │ │ │ └── tivi/ │ │ │ └── core/ │ │ │ └── permissions/ │ │ │ ├── PermissionsController.android.kt │ │ │ └── PermissionsPlatformComponent.kt │ │ ├── commonMain/ │ │ │ └── kotlin/ │ │ │ └── app/ │ │ │ └── tivi/ │ │ │ └── core/ │ │ │ └── permissions/ │ │ │ ├── PermissionsComponent.kt │ │ │ └── PermissionsController.common.kt │ │ ├── iosMain/ │ │ │ └── kotlin/ │ │ │ └── app/ │ │ │ └── tivi/ │ │ │ └── core/ │ │ │ └── permissions/ │ │ │ └── PermissionsPlatformComponent.kt │ │ ├── jvmMain/ │ │ │ └── kotlin/ │ │ │ └── app/ │ │ │ └── tivi/ │ │ │ └── core/ │ │ │ └── permissions/ │ │ │ └── PermissionsPlatformComponent.kt │ │ └── mokoImplMain/ │ │ └── kotlin/ │ │ └── app/ │ │ └── tivi/ │ │ └── core/ │ │ └── permissions/ │ │ └── PermissionsController.ios.kt │ ├── powercontroller/ │ │ ├── build.gradle.kts │ │ └── src/ │ │ ├── androidMain/ │ │ │ ├── AndroidManifest.xml │ │ │ └── kotlin/ │ │ │ └── app/ │ │ │ └── tivi/ │ │ │ └── util/ │ │ │ ├── AndroidPowerController.kt │ │ │ └── PowerControllerComponent.kt │ │ ├── commonMain/ │ │ │ └── kotlin/ │ │ │ └── app/ │ │ │ └── tivi/ │ │ │ └── util/ │ │ │ ├── PowerController.kt │ │ │ └── PowerControllerComponent.kt │ │ ├── iosMain/ │ │ │ └── kotlin/ │ │ │ └── app/ │ │ │ └── tivi/ │ │ │ └── util/ │ │ │ └── PowerControllerComponent.kt │ │ └── jvmMain/ │ │ └── kotlin/ │ │ └── app/ │ │ └── tivi/ │ │ └── util/ │ │ └── PowerControllerComponent.kt │ └── preferences/ │ ├── build.gradle.kts │ └── src/ │ ├── androidMain/ │ │ └── kotlin/ │ │ └── app/ │ │ └── tivi/ │ │ └── settings/ │ │ └── PreferencesComponent.kt │ ├── commonMain/ │ │ └── kotlin/ │ │ └── app/ │ │ └── tivi/ │ │ └── settings/ │ │ ├── Preference.kt │ │ ├── PreferencesComponent.kt │ │ ├── TiviPreferences.kt │ │ └── TiviPreferencesImpl.kt │ ├── iosMain/ │ │ └── kotlin/ │ │ └── app/ │ │ └── tivi/ │ │ └── settings/ │ │ └── PreferencesPlatformComponent.kt │ └── jvmMain/ │ └── kotlin/ │ └── app/ │ └── tivi/ │ └── settings/ │ └── PreferencesPlatformComponent.kt ├── data/ │ ├── anticipatedshows/ │ │ ├── build.gradle.kts │ │ └── src/ │ │ └── commonMain/ │ │ └── kotlin/ │ │ └── app/ │ │ └── tivi/ │ │ └── data/ │ │ └── anticipatedshows/ │ │ ├── AnticipatedShowsBinds.kt │ │ ├── AnticipatedShowsDataSource.kt │ │ ├── AnticipatedShowsLastRequestStore.kt │ │ ├── AnticipatedShowsStore.kt │ │ └── TraktAnticipatedShowsDataSource.kt │ ├── db/ │ │ ├── build.gradle.kts │ │ ├── room-schemas/ │ │ │ ├── 1.json │ │ │ ├── 10.json │ │ │ ├── 11.json │ │ │ ├── 12.json │ │ │ ├── 13.json │ │ │ ├── 14.json │ │ │ ├── 15.json │ │ │ ├── 16.json │ │ │ ├── 17.json │ │ │ ├── 18.json │ │ │ ├── 19.json │ │ │ ├── 2.json │ │ │ ├── 20.json │ │ │ ├── 21.json │ │ │ ├── 22.json │ │ │ ├── 23.json │ │ │ ├── 24.json │ │ │ ├── 25.json │ │ │ ├── 26.json │ │ │ ├── 27.json │ │ │ ├── 28.json │ │ │ ├── 29.json │ │ │ ├── 3.json │ │ │ ├── 30.json │ │ │ ├── 31.json │ │ │ ├── 32.json │ │ │ ├── 4.json │ │ │ ├── 5.json │ │ │ ├── 6.json │ │ │ ├── 7.json │ │ │ ├── 8.json │ │ │ └── 9.json │ │ └── src/ │ │ └── commonMain/ │ │ └── kotlin/ │ │ └── app/ │ │ └── tivi/ │ │ └── data/ │ │ ├── daos/ │ │ │ ├── AnticipatedShowsDao.kt │ │ │ ├── EntityDao.kt │ │ │ ├── EntryDao.kt │ │ │ ├── EpisodeWatchEntryDao.kt │ │ │ ├── EpisodesDao.kt │ │ │ ├── FollowedShowsDao.kt │ │ │ ├── LastRequestDao.kt │ │ │ ├── LibraryShowsDao.kt │ │ │ ├── PaginatedEntryDao.kt │ │ │ ├── PairEntryDao.kt │ │ │ ├── PopularDao.kt │ │ │ ├── RecommendedDao.kt │ │ │ ├── RelatedShowsDao.kt │ │ │ ├── SeasonsDao.kt │ │ │ ├── ShowFtsDao.kt │ │ │ ├── ShowTmdbImagesDao.kt │ │ │ ├── TiviShowDao.kt │ │ │ ├── TrendingDao.kt │ │ │ ├── UserDao.kt │ │ │ └── WatchedShowDao.kt │ │ └── db/ │ │ └── DatabaseTransactionRunner.kt │ ├── db-sqldelight/ │ │ ├── build.gradle.kts │ │ └── src/ │ │ ├── androidMain/ │ │ │ └── kotlin/ │ │ │ └── app/ │ │ │ └── tivi/ │ │ │ └── data/ │ │ │ └── SqlDelightDatabasePlatformComponent.kt │ │ ├── commonMain/ │ │ │ ├── kotlin/ │ │ │ │ └── app/ │ │ │ │ └── tivi/ │ │ │ │ └── data/ │ │ │ │ ├── DatabaseFactory.kt │ │ │ │ ├── SqlDelightDatabaseComponent.kt │ │ │ │ ├── SqlDelightTransactionRunner.kt │ │ │ │ ├── Utils.kt │ │ │ │ ├── columnadaptors/ │ │ │ │ │ ├── DayOfWeekColumnAdapter.kt │ │ │ │ │ ├── ImageTypeColumnAdapter.kt │ │ │ │ │ ├── InstantLongColumnAdapter.kt │ │ │ │ │ ├── InstantStringColumnAdapter.kt │ │ │ │ │ ├── LocalDateColumnAdapter.kt │ │ │ │ │ ├── LocalDateTimeColumnAdapter.kt │ │ │ │ │ ├── LocalTimeColumnAdapter.kt │ │ │ │ │ ├── PendingActionColumnAdapter.kt │ │ │ │ │ ├── RequestColumnAdapter.kt │ │ │ │ │ ├── ShowStatusColumnAdapter.kt │ │ │ │ │ └── TimeZoneColumnAdapter.kt │ │ │ │ ├── daos/ │ │ │ │ │ ├── SqlDelightAnticipatedShowsDao.kt │ │ │ │ │ ├── SqlDelightEntityDao.kt │ │ │ │ │ ├── SqlDelightEpisodeWatchEntryDao.kt │ │ │ │ │ ├── SqlDelightEpisodesDao.kt │ │ │ │ │ ├── SqlDelightFollowedShowsDao.kt │ │ │ │ │ ├── SqlDelightLastRequestDao.kt │ │ │ │ │ ├── SqlDelightLibraryShowsDao.kt │ │ │ │ │ ├── SqlDelightPopularShowsDao.kt │ │ │ │ │ ├── SqlDelightRecommendedShowsDao.kt │ │ │ │ │ ├── SqlDelightRelatedShowsDao.kt │ │ │ │ │ ├── SqlDelightSeasonsDao.kt │ │ │ │ │ ├── SqlDelightShowImagesDao.kt │ │ │ │ │ ├── SqlDelightTiviShowDao.kt │ │ │ │ │ ├── SqlDelightTrendingShowsDao.kt │ │ │ │ │ ├── SqlDelightUserDao.kt │ │ │ │ │ └── SqlDelightWatchedShowsDao.kt │ │ │ │ └── paging/ │ │ │ │ ├── KeyedQueryPagingSource.kt │ │ │ │ ├── OffsetQueryPagingSource.kt │ │ │ │ └── QueryPagingSource.kt │ │ │ └── sqldelight/ │ │ │ ├── app/ │ │ │ │ └── tivi/ │ │ │ │ └── data/ │ │ │ │ ├── anticipated_shows.sq │ │ │ │ ├── episode_watch_entries.sq │ │ │ │ ├── episodes.sq │ │ │ │ ├── last_requests.sq │ │ │ │ ├── library_shows.sq │ │ │ │ ├── myshows_entries.sq │ │ │ │ ├── popular_shows.sq │ │ │ │ ├── recommended_entries.sq │ │ │ │ ├── related_shows.sq │ │ │ │ ├── seasons.sq │ │ │ │ ├── show.sq │ │ │ │ ├── show_images.sq │ │ │ │ ├── shows_last_watched.sq │ │ │ │ ├── shows_next_to_watch.sq │ │ │ │ ├── shows_view_watch_stats.sq │ │ │ │ ├── trending_shows.sq │ │ │ │ ├── upnext_shows.sq │ │ │ │ ├── users.sq │ │ │ │ └── watched_entries.sq │ │ │ └── migrations/ │ │ │ ├── 29.sqm │ │ │ ├── 30.sqm │ │ │ ├── 31.sqm │ │ │ ├── 32.sqm │ │ │ ├── 33.sqm │ │ │ └── 34.sqm │ │ ├── iosMain/ │ │ │ └── kotlin/ │ │ │ └── app/ │ │ │ └── tivi/ │ │ │ └── data/ │ │ │ └── SqlDelightDatabasePlatformComponent.kt │ │ └── jvmMain/ │ │ └── kotlin/ │ │ └── app/ │ │ └── tivi/ │ │ └── data/ │ │ └── SqlDelightDatabasePlatformComponent.kt │ ├── episodes/ │ │ ├── build.gradle.kts │ │ └── src/ │ │ └── commonMain/ │ │ └── kotlin/ │ │ └── app/ │ │ └── tivi/ │ │ └── data/ │ │ └── episodes/ │ │ ├── EpisodeBinds.kt │ │ ├── EpisodeLastRequestStore.kt │ │ ├── EpisodeWatchLastRequestStore.kt │ │ ├── EpisodeWatchStore.kt │ │ ├── SeasonLastRequestStore.kt │ │ ├── SeasonsEpisodesRepository.kt │ │ ├── ShowSeasonsLastRequestStore.kt │ │ └── datasource/ │ │ ├── EpisodeDataSource.kt │ │ ├── EpisodeWatchesDataSource.kt │ │ └── SeasonsEpisodesDataSource.kt │ ├── followedshows/ │ │ ├── build.gradle.kts │ │ └── src/ │ │ └── commonMain/ │ │ └── kotlin/ │ │ └── app/ │ │ └── tivi/ │ │ └── data/ │ │ └── followedshows/ │ │ ├── FollowedShowsBinds.kt │ │ ├── FollowedShowsDataSource.kt │ │ ├── FollowedShowsLastRequestStore.kt │ │ ├── FollowedShowsRepository.kt │ │ └── TraktFollowedShowsDataSource.kt │ ├── legacy/ │ │ ├── build.gradle.kts │ │ └── src/ │ │ └── commonMain/ │ │ └── kotlin/ │ │ └── app/ │ │ └── tivi/ │ │ └── data/ │ │ ├── lastrequests/ │ │ │ ├── EntityLastRequestStore.kt │ │ │ └── GroupLastRequestStore.kt │ │ ├── mappers/ │ │ │ ├── EpisodeIdToTraktIdMapper.kt │ │ │ ├── Mapper.kt │ │ │ ├── Mappers.kt │ │ │ ├── SeasonIdToTraktIdMapper.kt │ │ │ ├── ShowIdToTmdbIdMapper.kt │ │ │ ├── ShowIdToTraktIdMapper.kt │ │ │ ├── ShowIdToTraktOrImdbIdMapper.kt │ │ │ ├── TmdbEpisodeDetailToEpisode.kt │ │ │ ├── TmdbEpisodeToEpisode.kt │ │ │ ├── TmdbSeasonDetailToSeason.kt │ │ │ ├── TmdbSeasonToSeason.kt │ │ │ ├── TmdbSeasonToSeasonWithEpisodes.kt │ │ │ ├── TmdbShowDetailToShowImages.kt │ │ │ ├── TmdbShowDetailToTiviShow.kt │ │ │ ├── TmdbShowPageResultToTiviShows.kt │ │ │ ├── TmdbShowToTiviShow.kt │ │ │ ├── TraktBaseShowToWatchedShowEntry.kt │ │ │ ├── TraktEpisodeToEpisode.kt │ │ │ ├── TraktHistoryEntryToEpisode.kt │ │ │ ├── TraktHistoryItemToEpisodeWatchEntry.kt │ │ │ ├── TraktListItemToFollowedShowEntry.kt │ │ │ ├── TraktListItemToTiviShow.kt │ │ │ ├── TraktSeasonToSeason.kt │ │ │ ├── TraktSeasonToSeasonWithEpisodes.kt │ │ │ ├── TraktShowToTiviShow.kt │ │ │ ├── TraktStatusToShowStatus.kt │ │ │ ├── TraktTrendingShowToTiviShow.kt │ │ │ ├── TraktTrendingShowToTrendingShowEntry.kt │ │ │ └── UserToTraktUser.kt │ │ └── util/ │ │ ├── ItemSyncer.kt │ │ └── StoreExtensions.kt │ ├── licenses/ │ │ ├── build.gradle.kts │ │ └── src/ │ │ ├── androidMain/ │ │ │ └── kotlin/ │ │ │ └── app/ │ │ │ └── tivi/ │ │ │ └── data/ │ │ │ └── licenses/ │ │ │ ├── LicenseDataPlatformComponent.kt │ │ │ └── fetcher/ │ │ │ └── AndroidLicensesFetcherImpl.kt │ │ ├── commonMain/ │ │ │ └── kotlin/ │ │ │ └── app/ │ │ │ └── tivi/ │ │ │ └── data/ │ │ │ └── licenses/ │ │ │ ├── LicenseDataComponent.kt │ │ │ ├── LicensesState.kt │ │ │ ├── fetcher/ │ │ │ │ └── LicensesFetcher.kt │ │ │ └── store/ │ │ │ ├── LicensesStore.kt │ │ │ └── LicensesStoreImpl.kt │ │ ├── iosMain/ │ │ │ └── kotlin/ │ │ │ └── app/ │ │ │ └── tivi/ │ │ │ └── data/ │ │ │ └── licenses/ │ │ │ ├── LicenseDataPlatformComponent.kt │ │ │ └── fetcher/ │ │ │ └── IosLicensesFetcherImpl.kt │ │ └── jvmMain/ │ │ └── kotlin/ │ │ └── app/ │ │ └── tivi/ │ │ └── data/ │ │ └── licenses/ │ │ ├── LicenseDataPlatformComponent.kt │ │ └── fetcher/ │ │ └── JvmLicensesFetcherImpl.kt │ ├── models/ │ │ ├── build.gradle.kts │ │ └── src/ │ │ └── commonMain/ │ │ └── kotlin/ │ │ └── app/ │ │ └── tivi/ │ │ └── data/ │ │ ├── compoundmodels/ │ │ │ ├── EntryWithShow.kt │ │ │ ├── EpisodeWithSeason.kt │ │ │ ├── EpisodeWithWatches.kt │ │ │ ├── LibraryShow.kt │ │ │ ├── SeasonWithEpisodes.kt │ │ │ ├── SeasonWithEpisodesAndWatches.kt │ │ │ ├── SeasonWithShow.kt │ │ │ ├── ShowSeasonEpisode.kt │ │ │ └── UpNextEntry.kt │ │ ├── imagemodels/ │ │ │ ├── EpisodeImageModel.kt │ │ │ ├── ImageModel.kt │ │ │ ├── SeasonImageModel.kt │ │ │ └── ShowImageModel.kt │ │ ├── models/ │ │ │ ├── ActionDate.kt │ │ │ ├── AnticipatedShowEntry.kt │ │ │ ├── Entry.kt │ │ │ ├── Episode.kt │ │ │ ├── EpisodeWatchEntry.kt │ │ │ ├── FollowedShowEntry.kt │ │ │ ├── Genre.kt │ │ │ ├── LastRequest.kt │ │ │ ├── Notification.kt │ │ │ ├── PendingAction.kt │ │ │ ├── PopularShowEntry.kt │ │ │ ├── RecommendedShowEntry.kt │ │ │ ├── RelatedShowEntry.kt │ │ │ ├── Request.kt │ │ │ ├── Season.kt │ │ │ ├── ShowImages.kt │ │ │ ├── ShowStatus.kt │ │ │ ├── ShowTmdbImage.kt │ │ │ ├── SortOption.kt │ │ │ ├── TiviEntity.kt │ │ │ ├── TiviShow.kt │ │ │ ├── TraktUser.kt │ │ │ ├── TrendingShowEntry.kt │ │ │ └── WatchedShowEntry.kt │ │ ├── util/ │ │ │ ├── DateTimeUtils.kt │ │ │ ├── ImageEntityUtils.kt │ │ │ └── MergeShowUtils.kt │ │ └── views/ │ │ ├── ShowsNextToWatch.kt │ │ └── ShowsWatchStats.kt │ ├── popularshows/ │ │ ├── build.gradle.kts │ │ └── src/ │ │ └── commonMain/ │ │ └── kotlin/ │ │ └── app/ │ │ └── tivi/ │ │ └── data/ │ │ └── popularshows/ │ │ ├── PopularShowsBinds.kt │ │ ├── PopularShowsDataSource.kt │ │ ├── PopularShowsLastRequestStore.kt │ │ ├── PopularShowsStore.kt │ │ └── TraktPopularShowsDataSource.kt │ ├── recommendedshows/ │ │ ├── build.gradle.kts │ │ └── src/ │ │ └── commonMain/ │ │ └── kotlin/ │ │ └── app/ │ │ └── tivi/ │ │ └── data/ │ │ └── recommendedshows/ │ │ ├── RecommendedShowsBinds.kt │ │ ├── RecommendedShowsDataSource.kt │ │ ├── RecommendedShowsLastRequestStore.kt │ │ ├── RecommendedShowsStore.kt │ │ └── TraktRecommendedShowsDataSource.kt │ ├── relatedshows/ │ │ ├── build.gradle.kts │ │ └── src/ │ │ └── commonMain/ │ │ └── kotlin/ │ │ └── app/ │ │ └── tivi/ │ │ └── data/ │ │ └── relatedshows/ │ │ ├── RelatedShowsBinds.kt │ │ ├── RelatedShowsDataSource.kt │ │ ├── RelatedShowsLastRequestStore.kt │ │ ├── RelatedShowsStore.kt │ │ ├── TmdbRelatedShowsDataSourceImpl.kt │ │ └── TraktRelatedShowsDataSourceImpl.kt │ ├── search/ │ │ ├── build.gradle.kts │ │ └── src/ │ │ └── commonMain/ │ │ └── kotlin/ │ │ └── app/ │ │ └── tivi/ │ │ └── data/ │ │ └── search/ │ │ ├── SearchBinds.kt │ │ ├── SearchDataSource.kt │ │ ├── SearchRepository.kt │ │ └── TmdbSearchDataSource.kt │ ├── showimages/ │ │ ├── build.gradle.kts │ │ └── src/ │ │ └── commonMain/ │ │ └── kotlin/ │ │ └── app/ │ │ └── tivi/ │ │ └── data/ │ │ └── showimages/ │ │ ├── ShowImagesBinds.kt │ │ ├── ShowImagesDataSource.kt │ │ ├── ShowImagesLastRequestStore.kt │ │ ├── ShowImagesStore.kt │ │ └── TmdbShowImagesDataSource.kt │ ├── shows/ │ │ ├── build.gradle.kts │ │ └── src/ │ │ └── commonMain/ │ │ └── kotlin/ │ │ └── app/ │ │ └── tivi/ │ │ └── data/ │ │ └── shows/ │ │ ├── ShowDataSource.kt │ │ ├── ShowLastRequestStore.kt │ │ ├── ShowStore.kt │ │ ├── ShowsBinds.kt │ │ ├── TmdbShowDataSourceImpl.kt │ │ └── TraktShowDataSourceImpl.kt │ ├── test/ │ │ ├── build.gradle.kts │ │ └── src/ │ │ ├── androidUnitTest/ │ │ │ └── kotlin/ │ │ │ └── app/ │ │ │ └── tivi/ │ │ │ └── data/ │ │ │ └── DatabaseTest.kt │ │ ├── commonTest/ │ │ │ └── kotlin/ │ │ │ └── app/ │ │ │ └── tivi/ │ │ │ ├── data/ │ │ │ │ ├── DatabaseTest.kt │ │ │ │ ├── dao/ │ │ │ │ │ ├── EpisodeWatchEntryTest.kt │ │ │ │ │ ├── EpisodesTest.kt │ │ │ │ │ └── SeasonsTest.kt │ │ │ │ └── repositories/ │ │ │ │ ├── FollowedShowRepositoryTest.kt │ │ │ │ └── SeasonsEpisodesRepositoryTest.kt │ │ │ └── utils/ │ │ │ ├── AuthorizedAuthStore.kt │ │ │ ├── Dispatchers.kt │ │ │ ├── FakeEpisodeDataSource.kt │ │ │ ├── FakeEpisodeWatchesDataSource.kt │ │ │ ├── FakeFollowedShowsDataSource.kt │ │ │ ├── FakeSeasonsEpisodesDataSource.kt │ │ │ ├── Fakes.kt │ │ │ ├── ObjectGraph.kt │ │ │ ├── SampleData.kt │ │ │ └── TestTransactionRunner.kt │ │ ├── jvmTest/ │ │ │ └── kotlin/ │ │ │ └── app/ │ │ │ └── tivi/ │ │ │ └── data/ │ │ │ └── DatabaseTest.kt │ │ └── nativeTest/ │ │ └── kotlin/ │ │ └── app/ │ │ └── tivi/ │ │ └── data/ │ │ └── DatabaseTest.kt │ ├── traktauth/ │ │ ├── build.gradle.kts │ │ └── src/ │ │ ├── androidMain/ │ │ │ └── kotlin/ │ │ │ └── app/ │ │ │ └── tivi/ │ │ │ └── data/ │ │ │ └── traktauth/ │ │ │ ├── AndroidTraktLoginAction.kt │ │ │ ├── AndroidTraktRefreshTokenAction.kt │ │ │ ├── AppAuthAuthStateWrapper.kt │ │ │ ├── LoginTraktActivityResultContract.kt │ │ │ ├── TraktAuthComponent.kt │ │ │ ├── TraktAuthInitializer.kt │ │ │ └── store/ │ │ │ ├── BlockStoreAuthStore.kt │ │ │ ├── PreferencesAuthStore.kt │ │ │ └── TiviAuthStore.kt │ │ ├── commonMain/ │ │ │ └── kotlin/ │ │ │ └── app/ │ │ │ └── tivi/ │ │ │ └── data/ │ │ │ └── traktauth/ │ │ │ ├── AuthState.kt │ │ │ ├── TraktAuthComponent.kt │ │ │ ├── TraktAuthRepository.kt │ │ │ ├── TraktAuthState.kt │ │ │ ├── TraktLoginAction.kt │ │ │ ├── TraktOAuthInfo.kt │ │ │ ├── TraktRefreshTokenAction.kt │ │ │ └── store/ │ │ │ └── AuthStore.kt │ │ ├── iosMain/ │ │ │ └── kotlin/ │ │ │ └── app/ │ │ │ └── tivi/ │ │ │ └── data/ │ │ │ └── traktauth/ │ │ │ ├── IosAuthStore.kt │ │ │ └── TraktAuthComponent.kt │ │ └── jvmMain/ │ │ └── kotlin/ │ │ └── app/ │ │ └── tivi/ │ │ └── data/ │ │ └── traktauth/ │ │ ├── DesktopAuthStore.kt │ │ ├── DesktopTraktLoginAction.kt │ │ ├── DesktopTraktRefreshTokenAction.kt │ │ └── TraktAuthComponent.kt │ ├── traktusers/ │ │ ├── build.gradle.kts │ │ └── src/ │ │ └── commonMain/ │ │ └── kotlin/ │ │ └── app/ │ │ └── tivi/ │ │ └── data/ │ │ └── traktusers/ │ │ ├── TraktUsersBinds.kt │ │ ├── TraktUsersDataSource.kt │ │ ├── TraktUsersLastRequestStore.kt │ │ ├── TraktUsersRepository.kt │ │ └── UsersDataSource.kt │ ├── trendingshows/ │ │ ├── build.gradle.kts │ │ └── src/ │ │ └── commonMain/ │ │ └── kotlin/ │ │ └── app/ │ │ └── tivi/ │ │ └── data/ │ │ └── trendingshows/ │ │ ├── TraktTrendingShowsDataSource.kt │ │ ├── TrendingShowsBinds.kt │ │ ├── TrendingShowsDataSource.kt │ │ ├── TrendingShowsLastRequestStore.kt │ │ └── TrendingShowsStore.kt │ └── watchedshows/ │ ├── build.gradle.kts │ └── src/ │ └── commonMain/ │ └── kotlin/ │ └── app/ │ └── tivi/ │ └── data/ │ └── watchedshows/ │ ├── TraktWatchedShowsDataSource.kt │ ├── WatchedShowsBinds.kt │ ├── WatchedShowsDataSource.kt │ ├── WatchedShowsLastRequestStore.kt │ └── WatchedShowsStore.kt ├── desktop-app/ │ ├── build.gradle.kts │ └── src/ │ └── jvmMain/ │ └── kotlin/ │ └── app/ │ └── tivi/ │ └── Main.kt ├── docs/ │ ├── _config.yml │ └── privacypolicy.md ├── domain/ │ ├── build.gradle.kts │ └── src/ │ └── commonMain/ │ └── kotlin/ │ └── app/ │ └── tivi/ │ └── domain/ │ ├── Interactor.kt │ ├── PaginatedEntryRemoteMediator.kt │ ├── RefreshOnlyRemoteMediator.kt │ ├── interactors/ │ │ ├── AddEpisodeWatch.kt │ │ ├── ChangeSeasonFollowStatus.kt │ │ ├── ChangeSeasonWatchedStatus.kt │ │ ├── ChangeShowFollowStatus.kt │ │ ├── ClearUserDetails.kt │ │ ├── FetchLicensesList.kt │ │ ├── GetTraktAuthState.kt │ │ ├── LoginTrakt.kt │ │ ├── LogoutTrakt.kt │ │ ├── RefreshTraktTokens.kt │ │ ├── RemoveEpisodeWatch.kt │ │ ├── RemoveEpisodeWatches.kt │ │ ├── ScheduleDebugEpisodeNotification.kt │ │ ├── ScheduleEpisodeNotifications.kt │ │ ├── SearchShows.kt │ │ ├── UpdateAnticipatedShows.kt │ │ ├── UpdateEpisodeDetails.kt │ │ ├── UpdateLibraryShows.kt │ │ ├── UpdatePopularShows.kt │ │ ├── UpdateRecommendedShows.kt │ │ ├── UpdateRelatedShows.kt │ │ ├── UpdateShowDetails.kt │ │ ├── UpdateShowImages.kt │ │ ├── UpdateShowSeasons.kt │ │ ├── UpdateTmdbConfig.kt │ │ ├── UpdateTrendingShows.kt │ │ ├── UpdateUpNextEpisodes.kt │ │ └── UpdateUserDetails.kt │ └── observers/ │ ├── ObserveAnticipatedShows.kt │ ├── ObserveEpisodeDetails.kt │ ├── ObserveEpisodeWatches.kt │ ├── ObserveNextShowEpisodesToWatch.kt │ ├── ObservePagedAnticipatedShows.kt │ ├── ObservePagedLibraryShows.kt │ ├── ObservePagedPopularShows.kt │ ├── ObservePagedRecommendedShows.kt │ ├── ObservePagedTrendingShows.kt │ ├── ObservePagedUpNextShows.kt │ ├── ObservePopularShows.kt │ ├── ObserveRecommendedShows.kt │ ├── ObserveRelatedShows.kt │ ├── ObserveShowDetails.kt │ ├── ObserveShowDetailsForEpisodeId.kt │ ├── ObserveShowFollowStatus.kt │ ├── ObserveShowImages.kt │ ├── ObserveShowNextEpisodeToWatch.kt │ ├── ObserveShowSeasonsEpisodesWatches.kt │ ├── ObserveShowViewStats.kt │ ├── ObserveTraktAuthState.kt │ ├── ObserveTrendingShows.kt │ └── ObserveUserDetails.kt ├── fastlane/ │ ├── Fastfile │ ├── Matchfile │ ├── metadata/ │ │ └── android/ │ │ └── en_US/ │ │ ├── full_description.txt │ │ ├── short_description.txt │ │ ├── title.txt │ │ └── video.txt │ └── screenshots/ │ └── screenshots.html ├── gradle/ │ ├── build-logic/ │ │ ├── convention/ │ │ │ ├── build.gradle.kts │ │ │ └── src/ │ │ │ └── main/ │ │ │ └── kotlin/ │ │ │ └── app/ │ │ │ └── tivi/ │ │ │ └── gradle/ │ │ │ ├── Android.kt │ │ │ ├── AndroidApplicationConventionPlugin.kt │ │ │ ├── AndroidApplicationLicensesHandler.kt │ │ │ ├── AndroidLibraryConventionPlugin.kt │ │ │ ├── AndroidTestConventionPlugin.kt │ │ │ ├── AssetCopyTask.kt │ │ │ ├── ComposeMultiplatformConventionPlugin.kt │ │ │ ├── IosLicensesHandler.kt │ │ │ ├── Java.kt │ │ │ ├── Kotlin.kt │ │ │ ├── KotlinAndroidConventionPlugin.kt │ │ │ ├── KotlinMultiplatformConventionPlugin.kt │ │ │ ├── Licensee.kt │ │ │ ├── RootConventionPlugin.kt │ │ │ ├── Spotless.kt │ │ │ ├── VersionCatalog.kt │ │ │ └── Versions.kt │ │ ├── gradle.properties │ │ └── settings.gradle.kts │ ├── dependencyGraph.gradle │ ├── libs.versions.toml │ └── wrapper/ │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradle.properties ├── gradlew ├── gradlew.bat ├── ios-app/ │ └── Tivi/ │ ├── Podfile │ ├── Settings.bundle/ │ │ └── Root.plist │ ├── Tivi/ │ │ ├── Assets.xcassets/ │ │ │ ├── AppIcon-QA.appiconset/ │ │ │ │ └── Contents.json │ │ │ ├── AppIcon.appiconset/ │ │ │ │ └── Contents.json │ │ │ └── Contents.json │ │ ├── Auth.swift │ │ ├── ContentView.swift │ │ ├── GoogleService-Info.plist │ │ ├── Info.plist │ │ ├── Preview Content/ │ │ │ └── Preview Assets.xcassets/ │ │ │ └── Contents.json │ │ └── TiviApp.swift │ ├── Tivi.xcodeproj/ │ │ ├── project.pbxproj │ │ ├── project.xcworkspace/ │ │ │ ├── contents.xcworkspacedata │ │ │ └── xcshareddata/ │ │ │ ├── IDEWorkspaceChecks.plist │ │ │ └── swiftpm/ │ │ │ └── Package.resolved │ │ └── xcshareddata/ │ │ └── xcschemes/ │ │ ├── Tivi Prod (StoreKit).xcscheme │ │ ├── Tivi Prod.xcscheme │ │ ├── Tivi QA.xcscheme │ │ └── UITests.xcscheme │ ├── Tivi.xcworkspace/ │ │ ├── contents.xcworkspacedata │ │ └── xcshareddata/ │ │ └── IDEWorkspaceChecks.plist │ ├── UITests/ │ │ ├── Extensions.swift │ │ ├── Screenshots.swift │ │ └── SnapshotHelper.swift │ └── xcconfig/ │ ├── Project.xcconfig │ ├── Tivi-Prod-Debug.xcconfig │ ├── Tivi-Prod-Release.xcconfig │ ├── Tivi-QA-Debug.xcconfig │ ├── Tivi-QA-Release.xcconfig │ ├── UITests.xcconfig │ └── common/ │ ├── Debug.xcconfig │ ├── Prod.xcconfig │ ├── QA.xcconfig │ └── Release.xcconfig ├── release/ │ ├── GoogleService-Info.plist.gpg │ ├── app-debug.jks │ ├── app-release.gpg │ ├── clean-secrets.sh │ ├── decrypt-secrets.sh │ ├── encrypt-secrets.sh │ ├── google-services.gpg │ └── play-account.gpg ├── renovate.json ├── room2sqld.py ├── settings.gradle.kts ├── shared/ │ ├── common/ │ │ ├── build.gradle.kts │ │ ├── lint-baseline.xml │ │ └── src/ │ │ ├── androidMain/ │ │ │ └── kotlin/ │ │ │ └── app/ │ │ │ └── tivi/ │ │ │ └── inject/ │ │ │ ├── SharedActivityComponent.kt │ │ │ └── SharedPlatformApplicationComponent.kt │ │ ├── commonMain/ │ │ │ └── kotlin/ │ │ │ └── app/ │ │ │ └── tivi/ │ │ │ ├── appinitializers/ │ │ │ │ └── AppInitializers.kt │ │ │ └── inject/ │ │ │ ├── SharedApplicationComponent.kt │ │ │ └── SharedUiComponent.kt │ │ ├── iosMain/ │ │ │ └── kotlin/ │ │ │ └── app/ │ │ │ └── tivi/ │ │ │ └── inject/ │ │ │ └── SharedPlatformApplicationComponent.kt │ │ └── jvmMain/ │ │ └── kotlin/ │ │ └── app/ │ │ └── tivi/ │ │ └── inject/ │ │ └── SharedPlatformApplicationComponent.kt │ ├── prod/ │ │ ├── build.gradle.kts │ │ ├── lint-baseline.xml │ │ └── src/ │ │ ├── androidMain/ │ │ │ └── kotlin/ │ │ │ └── app/ │ │ │ └── tivi/ │ │ │ └── inject/ │ │ │ ├── AndroidActivityComponent.kt │ │ │ └── AndroidApplicationComponent.kt │ │ ├── commonMain/ │ │ │ └── kotlin/ │ │ │ └── app/ │ │ │ └── tivi/ │ │ │ └── inject/ │ │ │ ├── ProdApplicationComponent.kt │ │ │ └── ProdUiComponent.kt │ │ ├── iosMain/ │ │ │ └── kotlin/ │ │ │ └── app/ │ │ │ └── tivi/ │ │ │ └── inject/ │ │ │ ├── HomeUiControllerComponent.kt │ │ │ └── IosApplicationComponent.kt │ │ └── jvmMain/ │ │ └── kotlin/ │ │ └── app/ │ │ └── tivi/ │ │ └── inject/ │ │ ├── DesktopApplicationComponent.kt │ │ └── WindowComponent.kt │ └── qa/ │ ├── build.gradle.kts │ ├── lint-baseline.xml │ └── src/ │ ├── androidMain/ │ │ └── kotlin/ │ │ └── app/ │ │ └── tivi/ │ │ └── inject/ │ │ ├── AndroidActivityComponent.kt │ │ └── AndroidApplicationComponent.kt │ ├── commonMain/ │ │ └── kotlin/ │ │ └── app/ │ │ └── tivi/ │ │ └── inject/ │ │ ├── QaApplicationComponent.kt │ │ └── QaUiComponent.kt │ ├── iosMain/ │ │ └── kotlin/ │ │ └── app/ │ │ └── tivi/ │ │ └── inject/ │ │ ├── HomeUiControllerComponent.kt │ │ └── IosApplicationComponent.kt │ └── jvmMain/ │ └── kotlin/ │ └── app/ │ └── tivi/ │ └── inject/ │ ├── DesktopApplicationComponent.kt │ └── WindowComponent.kt ├── spotless/ │ ├── cb-copyright.txt │ └── google-copyright.txt ├── tasks/ │ ├── build.gradle.kts │ └── src/ │ ├── androidMain/ │ │ ├── AndroidManifest.xml │ │ └── kotlin/ │ │ └── app/ │ │ └── tivi/ │ │ └── tasks/ │ │ ├── AndroidTasks.kt │ │ ├── BootBroadcastReceiver.kt │ │ ├── ScheduleEpisodeNotificationsWorker.kt │ │ ├── SyncLibraryShowsWorker.kt │ │ ├── TasksPlatformComponent.kt │ │ └── TiviWorkerFactory.kt │ ├── commonMain/ │ │ └── kotlin/ │ │ └── app/ │ │ └── tivi/ │ │ └── tasks/ │ │ ├── Tasks.kt │ │ ├── TasksComponent.kt │ │ └── TasksInitializer.kt │ ├── iosMain/ │ │ └── kotlin/ │ │ └── app/ │ │ └── tivi/ │ │ └── tasks/ │ │ ├── IosTasks.kt │ │ └── TasksPlatformComponent.kt │ └── jvmMain/ │ └── kotlin/ │ └── app/ │ └── tivi/ │ └── tasks/ │ └── TasksPlatformComponent.kt ├── thirdparty/ │ └── androidx/ │ └── paging/ │ └── compose/ │ ├── build.gradle.kts │ └── src/ │ ├── androidMain/ │ │ └── kotlin/ │ │ └── PagingPlaceholders.android.kt │ ├── commonMain/ │ │ └── kotlin/ │ │ ├── LazyFoundationExtensions.kt │ │ ├── LazyPagingItems.kt │ │ └── PagingPlaceholders.kt │ ├── iosMain/ │ │ └── kotlin/ │ │ └── PagingPlaceholders.ios.kt │ └── jvmMain/ │ └── kotlin/ │ └── PagingPlaceholders.jvm.kt └── ui/ ├── account/ │ ├── build.gradle.kts │ ├── lint-baseline.xml │ └── src/ │ └── commonMain/ │ └── kotlin/ │ └── app/ │ └── tivi/ │ └── account/ │ ├── AccountComponent.kt │ ├── AccountPresenter.kt │ ├── AccountUi.kt │ └── AccountUiState.kt ├── anticipated/ │ ├── build.gradle.kts │ ├── lint-baseline.xml │ └── src/ │ └── commonMain/ │ └── kotlin/ │ └── app/ │ └── tivi/ │ └── home/ │ └── anticipated/ │ ├── AnticipatedShows.kt │ ├── AnticipatedShowsComponent.kt │ ├── AnticipatedShowsPresenter.kt │ └── AnticipatedShowsUiState.kt ├── developer/ │ ├── log/ │ │ ├── build.gradle.kts │ │ ├── lint-baseline.xml │ │ └── src/ │ │ └── commonMain/ │ │ └── kotlin/ │ │ └── app/ │ │ └── tivi/ │ │ └── developer/ │ │ └── log/ │ │ ├── DevLog.kt │ │ ├── DevLogComponent.kt │ │ ├── DevLogPresenter.kt │ │ └── DevLogUiState.kt │ ├── notifications/ │ │ ├── build.gradle.kts │ │ ├── lint-baseline.xml │ │ └── src/ │ │ └── commonMain/ │ │ └── kotlin/ │ │ └── app/ │ │ └── tivi/ │ │ └── developer/ │ │ └── notifications/ │ │ ├── DevNotifications.kt │ │ ├── DevNotificationsComponent.kt │ │ ├── DevNotificationsPresenter.kt │ │ └── DevNotificationsUiState.kt │ └── settings/ │ ├── build.gradle.kts │ ├── lint-baseline.xml │ └── src/ │ └── commonMain/ │ └── kotlin/ │ └── app/ │ └── tivi/ │ └── settings/ │ └── developer/ │ ├── DevSettings.kt │ ├── DevSettingsComponent.kt │ ├── DevSettingsPresenter.kt │ └── DevSettingsUiState.kt ├── discover/ │ ├── build.gradle.kts │ ├── lint-baseline.xml │ └── src/ │ └── commonMain/ │ └── kotlin/ │ └── app/ │ └── tivi/ │ └── home/ │ └── discover/ │ ├── Discover.kt │ ├── DiscoverComponent.kt │ ├── DiscoverPresenter.kt │ └── DiscoverUiState.kt ├── episode/ │ ├── details/ │ │ ├── build.gradle.kts │ │ ├── lint-baseline.xml │ │ └── src/ │ │ └── commonMain/ │ │ └── kotlin/ │ │ └── app/ │ │ └── tivi/ │ │ └── episodedetails/ │ │ ├── EpisodeDetails.kt │ │ ├── EpisodeDetailsComponent.kt │ │ ├── EpisodeDetailsPresenter.kt │ │ └── EpisodeDetailsUiState.kt │ └── track/ │ ├── build.gradle.kts │ ├── lint-baseline.xml │ └── src/ │ └── commonMain/ │ └── kotlin/ │ └── app/ │ └── tivi/ │ └── episode/ │ └── track/ │ ├── EpisodeTrack.kt │ ├── EpisodeTrackComponent.kt │ ├── EpisodeTrackPresenter.kt │ └── EpisodeTrackUiState.kt ├── library/ │ ├── build.gradle.kts │ ├── lint-baseline.xml │ └── src/ │ └── commonMain/ │ └── kotlin/ │ └── app/ │ └── tivi/ │ └── home/ │ └── library/ │ ├── Library.kt │ ├── LibraryComponent.kt │ ├── LibraryPresenter.kt │ └── LibraryUiState.kt ├── licenses/ │ ├── build.gradle.kts │ ├── lint-baseline.xml │ └── src/ │ └── commonMain/ │ └── kotlin/ │ └── app/ │ └── tivi/ │ └── settings/ │ └── licenses/ │ ├── Licenses.kt │ ├── LicensesComponent.kt │ ├── LicensesPresenter.kt │ └── LicensesUiState.kt ├── popular/ │ ├── build.gradle.kts │ ├── lint-baseline.xml │ └── src/ │ └── commonMain/ │ └── kotlin/ │ └── app/ │ └── tivi/ │ └── home/ │ └── popular/ │ ├── PopularShows.kt │ ├── PopularShowsComponent.kt │ ├── PopularShowsPresenter.kt │ └── PopularShowsUiState.kt ├── recommended/ │ ├── build.gradle.kts │ ├── lint-baseline.xml │ └── src/ │ └── commonMain/ │ └── kotlin/ │ └── app/ │ └── tivi/ │ └── home/ │ └── recommended/ │ ├── Recommended.kt │ ├── RecommendedShowsComponent.kt │ ├── RecommendedShowsPresenter.kt │ └── RecommendedShowsUiState.kt ├── root/ │ ├── build.gradle.kts │ ├── lint-baseline.xml │ └── src/ │ ├── commonMain/ │ │ └── kotlin/ │ │ └── app/ │ │ └── tivi/ │ │ └── home/ │ │ ├── Home.kt │ │ ├── RootUiComponent.kt │ │ ├── RootViewModel.kt │ │ └── TiviContent.kt │ └── iosMain/ │ └── kotlin/ │ └── app/ │ └── tivi/ │ └── home/ │ └── TiviUiViewController.kt ├── search/ │ ├── build.gradle.kts │ ├── lint-baseline.xml │ └── src/ │ └── commonMain/ │ └── kotlin/ │ └── app/ │ └── tivi/ │ └── home/ │ └── search/ │ ├── Search.kt │ ├── SearchComponent.kt │ ├── SearchPresenter.kt │ └── SearchUiState.kt ├── settings/ │ ├── build.gradle.kts │ ├── lint-baseline.xml │ └── src/ │ ├── androidMain/ │ │ └── kotlin/ │ │ └── app/ │ │ └── tivi/ │ │ └── settings/ │ │ └── Platform.kt │ ├── commonMain/ │ │ └── kotlin/ │ │ └── app/ │ │ └── tivi/ │ │ └── settings/ │ │ ├── Platform.kt │ │ ├── Settings.kt │ │ ├── SettingsComponent.kt │ │ ├── SettingsPresenter.kt │ │ └── SettingsUiState.kt │ ├── iosMain/ │ │ └── kotlin/ │ │ └── app/ │ │ └── tivi/ │ │ └── settings/ │ │ └── Platform.kt │ └── jvmMain/ │ └── kotlin/ │ └── app/ │ └── tivi/ │ └── settings/ │ └── Platform.kt ├── show/ │ ├── details/ │ │ ├── build.gradle.kts │ │ ├── lint-baseline.xml │ │ └── src/ │ │ └── commonMain/ │ │ └── kotlin/ │ │ └── app/ │ │ └── tivi/ │ │ └── showdetails/ │ │ └── details/ │ │ ├── ShowDetails.kt │ │ ├── ShowDetailsComponent.kt │ │ ├── ShowDetailsPresenter.kt │ │ └── ShowDetailsUiState.kt │ └── seasons/ │ ├── build.gradle.kts │ ├── lint-baseline.xml │ └── src/ │ └── commonMain/ │ └── kotlin/ │ └── app/ │ └── tivi/ │ └── showdetails/ │ └── seasons/ │ ├── ShowSeasons.kt │ ├── ShowSeasonsComponent.kt │ ├── ShowSeasonsPresenter.kt │ └── ShowSeasonsUiState.kt ├── trending/ │ ├── build.gradle.kts │ ├── lint-baseline.xml │ └── src/ │ └── commonMain/ │ └── kotlin/ │ └── app/ │ └── tivi/ │ └── home/ │ └── trending/ │ ├── Trending.kt │ ├── TrendingShowsComponent.kt │ ├── TrendingShowsPresenter.kt │ └── TrendingShowsUiState.kt └── upnext/ ├── build.gradle.kts ├── lint-baseline.xml └── src/ └── commonMain/ └── kotlin/ └── app/ └── tivi/ └── home/ └── upnext/ ├── UpNext.kt ├── UpNextComponent.kt ├── UpNextPresenter.kt └── UpNextUiState.kt